Technologieaustausch

Fassadengestaltungsmuster

2024-07-12

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

Das Fassadenentwurfsmuster, auch Erscheinungsmuster genannt, ist ein strukturelles Entwurfsmuster. Es wird hauptsächlich verwendet, um eine einheitliche Schnittstelle auf hoher Ebene für eine Reihe von Schnittstellen in einem Subsystem bereitzustellen und so die Verwendung des Subsystems zu vereinfachen. Im Folgenden finden Sie eine detaillierte Einführung in das Fassadenentwurfsmuster:

1. Definition

Das Fassadenmuster bietet eine externe Schnittstelle für mehrere komplexe Subsysteme und erleichtert so den Zugriff auf diese Subsysteme. Dieser Modus verfügt über eine einheitliche Schnittstelle zur Außenwelt, und externe Anwendungen müssen sich nicht um die internen Details des Subsystems kümmern, wodurch die Komplexität der Anwendung erheblich reduziert und die Wartbarkeit verbessert wird.

2. Motiv und Zweck

  • Komplexität reduzieren: Durch die Kapselung der Komplexität des Subsystems in der Facade-Klasse kann der Client das Subsystem über eine einfache Schnittstelle aufrufen, ohne die spezifische Implementierung des Subsystems tiefgreifend verstehen zu müssen.
  • Verbessern Sie die Benutzerfreundlichkeit: Der Fassadenmodus bietet eine einfache Schnittstelle, damit Clients das Subsystem einfacher nutzen können.
  • lose Kopplung: Durch die Einführung der Facade-Klasse wird die Kopplung zwischen dem Client und dem Subsystem verringert, sodass Änderungen innerhalb des Subsystems keine Auswirkungen auf den Client haben.

3. Struktur- und Klassendiagramm

Klassen Diagramm:

Der Fassadenmodus umfasst hauptsächlich die folgenden drei Rollen:

  • Fassade (Erscheinungsrolle) : Der Client kann die Methoden dieser Rolle aufrufen. Fassadenklassen sind sich der Funktionen und Verantwortlichkeiten der zugehörigen Subsysteme bewusst. Unter normalen Umständen delegiert diese Rolle alle vom Client gesendeten Anforderungen an das entsprechende Subsystem.
  • Subsystem (Subsystemrolle) : Es können ein oder mehrere Subsysteme gleichzeitig vorhanden sein. Jedes Subsystem ist keine separate Klasse, sondern eine Sammlung von Klassen. Jedes Subsystem kann direkt vom Client oder von der Erscheinungsrolle aufgerufen werden. Das Subsystem weiß nicht, dass das Erscheinungsbild existiert. Für das Subsystem ist das Erscheinungsbild nur ein weiterer Client.
  • Kunde (Kundenrolle): Der Benutzer ruft die Funktion des Subsystems über die Erscheinungsklasse auf.

4. Vor- und Nachteile

Vorteil
  1. Reduzieren Sie die Systemkomplexität: Durch die Bereitstellung einer einfachen Schnittstelle für Subsysteme wird es für Kunden einfacher, das System zu verstehen und zu verwenden.
  2. Verbessern Sie die Systemflexibilität: Wenn Änderungen innerhalb des Subsystems auftreten, müssen Sie nur die Facade-Klasse ändern, ohne den Client-Code zu ändern.
  3. Beachten Sie das Demeter-Gesetz: Durch die Einführung der Facade-Klasse wird die Abhängigkeit zwischen dem Client und dem Subsystem verringert.
Mangel
  1. Durch das Hinzufügen von Subsystemen oder die Erweiterung des Subsystemverhaltens können leicht Risiken entstehen: Da alle Anfragen über die Facade-Klasse weitergeleitet werden müssen, können neue Risiken entstehen, wenn die Facade-Klasse nicht ordnungsgemäß gestaltet ist.
  2. Entspricht nicht dem Auf-Zu-Prinzip: Wenn Sie das System erweitern müssen, müssen Sie in einigen Fällen möglicherweise den Code der Facade-Klasse ändern, was gegen das Offen-Geschlossen-Prinzip verstößt (dh offen für Erweiterungen, geschlossen für Änderungen).

5. Anwendungsszenarien

  • Der Fassadenmodus kann verwendet werden, wenn das System eine einfache Schnittstelle zur Außenwelt bereitstellen muss.
  • Fassadenmuster können verwendet werden, wenn das System die Komplexität von Subsystemen verbergen muss.
  • Wenn Sie eine mehrschichtige Systemstruktur aufbauen müssen, können Sie das Fassadenobjekt als Eingang zu jeder Schicht verwenden, um Schichtaufrufe zu vereinfachen.

6. Implementierungsbeispiele

In einem Heimkinosystem kann der Fassadenmodus verwendet werden, um die Benutzerbedienung zu vereinfachen. Beispielsweise müssen Benutzer nur eine Fernbedienung (Facade-Klasse) verwenden, um Projektoren, Lautsprecher, DVD-Player und andere Geräte (Subsysteme) zu steuern, ohne diese Geräte separat bedienen zu müssen.

  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 diesem Beispiel sehen Sie den Fassadenmodus, der sich besonders dazu eignet, mit mehreren Komponenten feste Prozesse zusammenzustellen und die Komplexität von Client-Aufrufen zu reduzieren.

7. Zusammenfassung

Das Fassadenentwurfsmuster ist ein sehr praktisches Entwurfsmuster, das die Systemkomplexität reduziert und die Benutzerfreundlichkeit und Flexibilität des Systems verbessert, indem es eine einheitliche Schnittstelle für Subsysteme bereitstellt. Allerdings müssen Sie sich bei der Verwendung dieses Modells auch über mögliche Mängel und Risiken im Klaren sein.

Wenn dieser Modus für Sie nützlich ist, denken Sie daran, ihn zu liken und zu sammeln.