Condivisione della tecnologia

Modello di progettazione della facciata

2024-07-12

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

Il modello di progettazione della facciata, noto anche come modello di aspetto, è un modello di progettazione strutturale. Viene utilizzato principalmente per fornire un'interfaccia unificata di alto livello per una serie di interfacce in un sottosistema, rendendo così il sottosistema più facile da usare. Di seguito è riportata un'introduzione dettagliata al modello di progettazione della facciata:

1. Definizione

Il modello Facade fornisce un'interfaccia esterna per più sottosistemi complessi, semplificando l'accesso a questi sottosistemi. Questa modalità ha un'interfaccia unificata con il mondo esterno e le applicazioni esterne non devono preoccuparsi dei dettagli interni del sottosistema, riducendo così notevolmente la complessità dell'applicazione e migliorando la manutenibilità.

2. Motivo e scopo

  • Ridurre la complessità: Incapsulando la complessità del sottosistema nella classe Facade, il client può chiamare il sottosistema attraverso una semplice interfaccia senza dover comprendere a fondo l'implementazione specifica del sottosistema.
  • Migliorare la facilità d'uso: La modalità Facade fornisce un'interfaccia semplice in modo che i client possano utilizzare il sottosistema più facilmente.
  • accoppiamento lasco: Introducendo la classe Facade, l'accoppiamento tra il client e il sottosistema viene ridotto, in modo che i cambiamenti all'interno del sottosistema non influenzino il client.

3. Struttura e diagramma delle classi

Diagramma delle classi:

La modalità Facciata comprende principalmente i seguenti tre ruoli:

  • Facciata (ruolo dell'aspetto) : Il client può chiamare i metodi di questo ruolo. Le classi di facciata sono consapevoli delle funzioni e delle responsabilità dei sottosistemi associati. In circostanze normali, questo ruolo delegherà tutte le richieste inviate dal client al sottosistema corrispondente.
  • Sottosistema (ruolo del sottosistema) : Possono esserci uno o più sottosistemi contemporaneamente. Ogni sottosistema non è una classe separata, ma una raccolta di classi. Ogni sottosistema può essere chiamato direttamente dal client o dal ruolo di comparsa. Il sottosistema non conosce l'esistenza dell'aspetto. Per il sottosistema, l'aspetto è solo un altro client.
  • Cliente (ruolo cliente): L'utente richiama la funzione del sottosistema attraverso la classe di apparenza.

4. Vantaggi e svantaggi

vantaggio
  1. Ridurre la complessità del sistema: Fornendo un'interfaccia semplice per i sottosistemi, è più semplice per i clienti comprendere e utilizzare il sistema.
  2. Migliorare la flessibilità del sistema: Quando si verificano modifiche all'interno del sottosistema, è necessario modificare solo la classe Facade, senza modificare il codice client.
  3. Rispettare la legge di Demetra: Introducendo la classe Facade, la dipendenza tra il client e il sottosistema viene ridotta.
discordanza
  1. L'aggiunta di sottosistemi o l'estensione del comportamento dei sottosistemi può facilmente introdurre rischi: Poiché tutte le richieste devono essere inoltrate tramite la classe Facade, se la classe Facade non è progettata correttamente, potrebbero essere introdotti nuovi rischi.
  2. Non rispetta il principio apri-chiudi: In alcuni casi, se è necessario estendere il sistema, potrebbe essere necessario modificare il codice della classe Facade, che viola il principio aperto-chiuso (ovvero aperto alle estensioni, chiuso alle modifiche).

5. Scenari applicativi

  • La modalità facciata può essere utilizzata quando il sistema deve fornire un'interfaccia semplice con il mondo esterno.
  • Il modello di facciata può essere utilizzato quando il sistema deve nascondere la complessità dei sottosistemi.
  • Quando è necessario costruire una struttura di sistema multistrato, è possibile utilizzare l'oggetto Facade come ingresso a ciascun livello per semplificare le chiamate ai livelli.

6. Esempi di implementazione

In un sistema home theater, la modalità Facade può essere utilizzata per semplificare le operazioni dell'utente. Ad esempio, gli utenti devono utilizzare un solo telecomando (classe Facade) per controllare proiettori, altoparlanti, lettori DVD e altri dispositivi (sottosistemi) senza dover utilizzare questi dispositivi separatamente.

  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. }

In questo esempio puoi vedere la modalità facciata, che è particolarmente adatta per utilizzare più componenti per assemblare processi fissi e ridurre la complessità delle chiamate dei client.

7. Riepilogo

Il modello di progettazione Facade è un modello di progettazione molto pratico che riduce la complessità del sistema e migliora la facilità d'uso e la flessibilità del sistema fornendo un'interfaccia unificata per i sottosistemi. Tuttavia, è necessario essere consapevoli anche dei possibili difetti e rischi quando si utilizza questo modello.

Se questa modalità ti è utile ricordati di mettere mi piace e collezionarla.