Partage de technologie

Modèle de conception de façade

2024-07-12

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

Le modèle de conception de façade, également connu sous le nom de modèle d'apparence, est un modèle de conception structurelle. Il est principalement utilisé pour fournir une interface de haut niveau unifiée pour un ensemble d'interfaces dans un sous-système, rendant ainsi le sous-système plus facile à utiliser. Ce qui suit est une introduction détaillée au modèle de conception Facade :

1. Définition

Le modèle Facade fournit une interface externe pour plusieurs sous-systèmes complexes, rendant ces sous-systèmes plus faciles d'accès. Ce mode dispose d'une interface unifiée avec le monde extérieur et les applications externes n'ont pas besoin de se soucier des détails internes du sous-système, réduisant ainsi considérablement la complexité de l'application et améliorant la maintenabilité.

2. Motif et objectif

  • Réduire la complexité: En encapsulant la complexité du sous-système dans la classe Facade, le client peut appeler le sous-système via une interface simple sans avoir à comprendre en profondeur l'implémentation spécifique du sous-système.
  • Améliorer la facilité d’utilisation: Le mode Façade fournit une interface simple afin que les clients puissent utiliser le sous-système plus facilement.
  • couplage lâche: En introduisant la classe Facade, le couplage entre le client et le sous-système est réduit, de sorte que les changements au sein du sous-système n'affecteront pas le client.

3. Structure et diagramme de classes

Diagramme de classes :

Le mode Façade comprend principalement les trois rôles suivants :

  • Façade (rôle d'apparence) : Le client peut appeler les méthodes de ce rôle. Les classes de façade connaissent les fonctions et les responsabilités du ou des sous-systèmes associés. Dans des circonstances normales, ce rôle déléguera toutes les demandes envoyées par le client au sous-système correspondant.
  • Sous-système (rôle de sous-système) : Il peut y avoir un ou plusieurs sous-systèmes en même temps. Chaque sous-système n’est pas une classe distincte, mais un ensemble de classes. Chaque sous-système peut être appelé directement par le client, ou par le rôle d'apparence. Le sous-système ne connaît pas l’existence de l’apparence. Pour le sous-système, l’apparence n’est qu’un autre client.
  • Client (rôle client): L'utilisateur appelle la fonction du sous-système via la classe d'apparence.

4. Avantages et inconvénients

avantage
  1. Réduire la complexité du système: En fournissant une interface simple pour les sous-systèmes, il permet aux clients de comprendre et d'utiliser plus facilement le système.
  2. Améliorer la flexibilité du système: Lorsque des changements surviennent au sein du sous-système, seule la classe Facade doit être modifiée, sans modifier le code client.
  3. Respecter la loi de Déméter: En introduisant la classe Facade, la dépendance entre le client et le sous-système est réduite.
défaut
  1. L'ajout de sous-systèmes ou l'extension du comportement des sous-systèmes peut facilement introduire des risques: Étant donné que toutes les demandes doivent être transmises via la classe Facade, si la classe Facade n'est pas conçue correctement, de nouveaux risques peuvent être introduits.
  2. Ne respecte pas le principe d'ouverture-fermeture: Dans certains cas, si vous devez étendre le système, vous devrez peut-être modifier le code de la classe Facade, ce qui viole le principe ouvert-fermé (c'est-à-dire ouvert aux extensions, fermé aux modifications).

5. Scénarios d'application

  • Le mode façade peut être utilisé lorsque le système doit fournir une interface simple avec le monde extérieur.
  • Le motif de façade peut être utilisé lorsque le système doit masquer la complexité des sous-systèmes.
  • Lorsque vous devez créer une structure de système multicouche, vous pouvez utiliser l'objet Façade comme entrée de chaque couche pour simplifier les appels de couche.

6. Exemples de mise en œuvre

Dans un système de cinéma maison, le mode Façade peut être utilisé pour simplifier les opérations de l'utilisateur. Par exemple, les utilisateurs n'ont besoin d'utiliser qu'une seule télécommande (classe Facade) pour contrôler les projecteurs, haut-parleurs, lecteurs DVD et autres appareils (sous-systèmes) sans avoir à faire fonctionner ces appareils séparément.

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

Dans cet exemple, vous pouvez voir le mode façade, particulièrement adapté à l'utilisation de plusieurs composants pour assembler des processus fixes et réduire la complexité des appels clients.

7. Résumé

Le modèle de conception Facade est un modèle de conception très pratique qui réduit la complexité du système et améliore la facilité d'utilisation et la flexibilité du système en fournissant une interface unifiée pour les sous-systèmes. Cependant, vous devez également être conscient des éventuelles lacunes et risques liés à l’utilisation de ce modèle.

Si ce mode vous est utile, pensez à le liker et à le collectionner.