Teknologian jakaminen

Julkisivusuunnittelukuvio

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Julkisivusuunnittelukuvio, joka tunnetaan myös nimellä ulkoasukuvio, on rakenteellinen suunnittelukuvio. Sitä käytetään pääasiassa yhtenäisen korkean tason rajapinnan tarjoamiseen alijärjestelmän rajapinnoille, mikä helpottaa alijärjestelmän käyttöä. Seuraava on yksityiskohtainen johdatus julkisivun suunnittelumalliin:

1. Määritelmä

Julkisivukuvio tarjoaa ulkoisen rajapinnan useille monimutkaisille alijärjestelmille, mikä tekee näistä alijärjestelmistä helpompia käyttää. Tässä tilassa on yhtenäinen käyttöliittymä ulkomaailmaan, eikä ulkoisten sovellusten tarvitse välittää osajärjestelmän sisäisistä yksityiskohdista, mikä vähentää huomattavasti sovelluksen monimutkaisuutta ja parantaa ylläpidettävyyttä.

2. Motiivi ja tarkoitus

  • Vähennä monimutkaisuutta: Kapseloimalla osajärjestelmän monimutkaisuuden Facade-luokkaan, asiakas voi kutsua alijärjestelmää yksinkertaisen käyttöliittymän kautta ilman, että hänen tarvitsee syvästi ymmärtää osajärjestelmän erityistä toteutusta.
  • Paranna käytön helppoutta: Julkisivutila tarjoaa yksinkertaisen käyttöliittymän, jotta asiakkaat voivat käyttää osajärjestelmää helpommin.
  • löysä kytkentä: Julkisivuluokan käyttöönoton myötä asiakkaan ja osajärjestelmän välinen kytkentä vähenee, joten alijärjestelmän sisäiset muutokset eivät vaikuta asiakkaaseen.

3. Rakenne- ja luokkakaavio

Luokkakaavio:

Julkisivutila sisältää pääasiassa seuraavat kolme roolia:

  • Julkisivu (ulkonäkörooli) : Asiakas voi kutsua tämän roolin menetelmiä. Julkisivuluokat ovat tietoisia niihin liittyvien osajärjestelmien toiminnoista ja vastuista. Normaaleissa olosuhteissa tämä rooli siirtää kaikki asiakkaan lähettämät pyynnöt vastaavalle alijärjestelmälle.
  • Alajärjestelmä (alijärjestelmän rooli) : Samanaikaisesti voi olla yksi tai useampi alijärjestelmä. Jokainen alijärjestelmä ei ole erillinen luokka, vaan kokoelma luokkia. Asiakas voi kutsua jokaista alijärjestelmää suoraan tai ulkoasun roolin perusteella. Alijärjestelmä ei tiedä ulkoasun olemassaoloa Alijärjestelmälle ulkoasu on vain toinen asiakas.
  • Asiakas (asiakkaan rooli): Käyttäjä kutsuu alijärjestelmän funktiota ulkoasuluokan kautta.

4. Edut ja haitat

etu
  1. Vähennä järjestelmän monimutkaisuutta: Tarjoamalla yksinkertaisen käyttöliittymän alijärjestelmille se helpottaa asiakkaiden ymmärtämistä ja käyttöä.
  2. Paranna järjestelmän joustavuutta: Kun alijärjestelmässä tapahtuu muutoksia, vain Julkisivuluokkaa tarvitsee muokata asiakaskoodia muuttamatta.
  3. Noudata Demeterin lakia: Julkisivuluokan käyttöönoton myötä asiakkaan ja osajärjestelmän välinen riippuvuus vähenee.
puute
  1. Osajärjestelmien lisääminen tai osajärjestelmän käyttäytymisen laajentaminen voi helposti tuoda riskejä: Koska kaikki pyynnöt on välitettävä Julkisivu-luokan kautta, jos Julkisivuluokkaa ei ole suunniteltu oikein, uusia riskejä saattaa esiintyä.
  2. Ei noudata auki-kiinni -periaatetta: Joissain tapauksissa, jos joudut laajentamaan järjestelmää, saatat joutua muokkaamaan Julkisivuluokan koodia, mikä rikkoo open-closed -periaatetta (eli avoin laajennuksille, suljettu muokkauksille).

5. Sovellusskenaariot

  • Julkisivutilaa voidaan käyttää, kun järjestelmän on tarjottava yksinkertainen käyttöliittymä ulkomaailmaan.
  • Julkisivukuviota voidaan käyttää, kun järjestelmän on piilotettava alijärjestelmien monimutkaisuus.
  • Kun sinun on rakennettava monikerroksinen järjestelmärakenne, voit käyttää Facade-objektia jokaisen kerroksen sisäänkäynninä tasokutsujen yksinkertaistamiseksi.

6. Toteutusesimerkkejä

Kotiteatterijärjestelmässä Facade-tilaa voidaan käyttää yksinkertaistamaan käyttäjän toimintoja. Käyttäjien tarvitsee esimerkiksi käyttää vain yhtä kaukosäädintä (julkisivuluokka) projektorien, kaiuttimien, DVD-soittimien ja muiden laitteiden (alijärjestelmien) ohjaamiseen ilman, että näitä laitteita tarvitsee käyttää erikseen.

  1. // 投影仪接口
  2. interface Projector {
  3. void on();
  4. void off();
  5. void focus();
  6. void wideScreenMode();
  7. }
  8. // 投影仪实现类
  9. class SimpleProjector implements Projector {
  10. @Override
  11. public void on() {
  12. System.out.println("Projector is on");
  13. }
  14. @Override
  15. public void off() {
  16. System.out.println("Projector is off");
  17. }
  18. @Override
  19. public void focus() {
  20. System.out.println("Adjusting projector focus");
  21. }
  22. @Override
  23. public void wideScreenMode() {
  24. System.out.println("Switching to wide screen mode");
  25. }
  26. }
  27. // DVD播放器接口
  28. interface DVDPlayer {
  29. void on();
  30. void off();
  31. void play();
  32. void stop();
  33. void pause();
  34. void eject();
  35. void setTwoChannelAudio();
  36. void setSurroundAudio();
  37. }
  38. // DVD播放器实现类
  39. class SimpleDVDPlayer implements DVDPlayer {
  40. @Override
  41. public void on() {
  42. System.out.println("DVD Player is on");
  43. }
  44. @Override
  45. public void off() {
  46. System.out.println("DVD Player is off");
  47. }
  48. @Override
  49. public void play() {
  50. System.out.println("DVD Player is playing");
  51. }
  52. @Override
  53. public void stop() {
  54. System.out.println("DVD Player stopped");
  55. }
  56. @Override
  57. public void pause() {
  58. System.out.println("DVD Player paused");
  59. }
  60. @Override
  61. public void eject() {
  62. System.out.println("DVD ejected");
  63. }
  64. @Override
  65. public void setTwoChannelAudio() {
  66. System.out.println("Stereo mode is on");
  67. }
  68. @Override
  69. public void setSurroundAudio() {
  70. System.out.println("Surround sound mode is on");
  71. }
  72. }
  73. // 音响接口
  74. interface Amplifier {
  75. void on();
  76. void off();
  77. void setStereoSound();
  78. void setSurroundSound();
  79. void setVolume(int volume);
  80. }
  81. // 音响实现类
  82. class StereoAmplifier implements Amplifier {
  83. @Override
  84. public void on() {
  85. System.out.println("Amplifier is on");
  86. }
  87. @Override
  88. public void off() {
  89. System.out.println("Amplifier is off");
  90. }
  91. @Override
  92. public void setStereoSound() {
  93. System.out.println("Stereo mode is on");
  94. }
  95. @Override
  96. public void setSurroundSound() {
  97. System.out.println("Surround sound mode is on");
  98. }
  99. @Override
  100. public void setVolume(int volume) {
  101. System.out.println("Setting volume to " + volume);
  102. }
  103. }
  104. // 家庭影院Facade类
  105. class HomeTheaterFacade {
  106. private Projector projector;
  107. private DVDPlayer dvdPlayer;
  108. private Amplifier amplifier;
  109. public HomeTheaterFacade(Projector projector, DVDPlayer dvdPlayer, Amplifier amplifier) {
  110. this.projector = projector;
  111. this.dvdPlayer = dvdPlayer;
  112. this.amplifier = amplifier;
  113. }
  114. // 提供一个简单的方法来观看电影
  115. public void watchMovie(String movie) {
  116. System.out.println("Get ready to watch a movie...");
  117. projector.on();
  118. projector.wideScreenMode();
  119. amplifier.on();
  120. amplifier.setSurroundSound();
  121. amplifier.setVolume(5);
  122. dvdPlayer.on();
  123. dvdPlayer.play(movie);
  124. System.out.println("Enjoy the movie...");
  125. }
  126. // 提供一个简单的方法来结束观看
  127. public void endMovie() {
  128. System.out.println("Shutting movie theater down...");
  129. projector.off();
  130. amplifier.off();
  131. dvdPlayer.stop();
  132. dvdPlayer.eject();
  133. dvdPlayer.off();
  134. }
  135. }
  136. class Client{
  137. public static void main(String[] args) {
  138. Projector projector = new SimpleProjector();
  139. DVDPlayer dvdPlayer = new SimpleDVDPlayer();
  140. Amplifier amplifier = new StereoAmplifier();
  141. HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(projector,dvdPlayer,amplifier);
  142. homeTheaterFacade.watchMovie("肖申克的救赎");
  143. homeTheaterFacade.endMovie();
  144. }
  145. }

Tässä esimerkissä näet julkisivutilan, joka sopii erityisen hyvin useiden komponenttien käyttämiseen kiinteiden prosessien kokoamiseen ja asiakaspuheluiden monimutkaisuuden vähentämiseen.

7. Yhteenveto

Julkisivusuunnittelukuvio on erittäin käytännöllinen suunnittelumalli, joka vähentää järjestelmän monimutkaisuutta ja parantaa järjestelmän helppokäyttöisyyttä ja joustavuutta tarjoamalla yhtenäisen käyttöliittymän osajärjestelmille. Sinun on kuitenkin myös oltava tietoinen mahdollisista puutteista ja riskeistä, kun käytät tätä mallia.

Jos tämä tila on sinulle hyödyllinen, muista tykätä ja kerätä siitä.