Compartir tecnología

Patrón de diseño de fachada

2024-07-12

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

El patrón de diseño de fachada, también conocido como patrón de apariencia, es un patrón de diseño estructural que se utiliza principalmente para proporcionar una interfaz unificada de alto nivel para un conjunto de interfaces en un subsistema, lo que hace que el subsistema sea más fácil de usar. La siguiente es una introducción detallada al patrón de diseño Fachada:

1. Definición

El patrón Facade proporciona una interfaz externa para múltiples subsistemas complejos, lo que facilita el acceso a estos subsistemas. Este modo tiene una interfaz unificada con el mundo exterior y las aplicaciones externas no necesitan preocuparse por los detalles internos del subsistema, lo que reduce en gran medida la complejidad de la aplicación y mejora la capacidad de mantenimiento.

2. Motivo y finalidad

  • Reducir la complejidad: Al encapsular la complejidad del subsistema en la clase Facade, el cliente puede llamar al subsistema a través de una interfaz simple sin tener que comprender profundamente la implementación específica del subsistema.
  • Mejorar la facilidad de uso: El modo Fachada proporciona una interfaz sencilla para que los clientes puedan utilizar el subsistema más fácilmente.
  • bajo acoplamiento: Al introducir la clase Facade, se reduce el acoplamiento entre el cliente y el subsistema, de modo que los cambios dentro del subsistema no afectarán al cliente.

3. Estructura y diagrama de clases.

Diagrama de clase:

El modo fachada incluye principalmente los siguientes tres roles:

  • Fachada (rol de apariencia) : El cliente puede llamar a los métodos de este rol. Las clases de fachada conocen las funciones y responsabilidades de los subsistemas asociados. En circunstancias normales, este rol delegará todas las solicitudes enviadas desde el cliente al subsistema correspondiente.
  • Subsistema (rol del subsistema) : Puede haber uno o más subsistemas al mismo tiempo. Cada subsistema no es una clase separada, sino una colección de clases. Cada subsistema puede ser llamado directamente por el cliente o por el rol de apariencia. El subsistema no conoce la existencia de la apariencia. Para el subsistema, la apariencia es simplemente otro cliente.
  • Cliente (rol de cliente): El usuario llama a la función del subsistema a través de la clase de apariencia.

4. Ventajas y desventajas

ventaja
  1. Reducir la complejidad del sistema: Al proporcionar una interfaz simple para los subsistemas, facilita a los clientes la comprensión y el uso del sistema.
  2. Mejorar la flexibilidad del sistema: Cuando ocurren cambios dentro del subsistema, solo necesita modificar la clase Fachada sin modificar el código del cliente.
  3. Cumplir con la ley de Demeter: Al introducir la clase Facade, se reduce la dependencia entre el cliente y el subsistema.
defecto
  1. Agregar subsistemas o ampliar el comportamiento de los subsistemas puede introducir riesgos fácilmente: Debido a que todas las solicitudes deben reenviarse a través de la clase Facade, si la clase Facade no está diseñada correctamente, se pueden introducir nuevos riesgos.
  2. No cumple con el principio de abrir-cerrar.: En algunos casos, si necesita extender el sistema, es posible que deba modificar el código de la clase Facade, lo que viola el principio abierto-cerrado (es decir, abierto a extensiones, cerrado a modificaciones).

5. Escenarios de aplicación

  • El modo fachada se puede utilizar cuando el sistema necesita proporcionar una interfaz sencilla con el mundo exterior.
  • El patrón de fachada se puede utilizar cuando el sistema necesita ocultar la complejidad de los subsistemas.
  • Cuando necesite construir una estructura de sistema de múltiples capas, puede usar el objeto Fachada como entrada a cada capa para simplificar las llamadas de capa.

6. Ejemplos de implementación

En un sistema de cine en casa, el modo Fachada se puede utilizar para simplificar las operaciones del usuario. Por ejemplo, los usuarios sólo necesitan utilizar un control remoto (clase Facade) para controlar proyectores, parlantes, reproductores de DVD y otros dispositivos (subsistemas) sin tener que operar estos dispositivos por separado.

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

En este ejemplo, puede ver el modo fachada, que es particularmente adecuado para usar múltiples componentes para ensamblar procesos fijos y reducir la complejidad de las llamadas de los clientes.

7. Resumen

El patrón de diseño Facade es un patrón de diseño muy práctico que reduce la complejidad del sistema y mejora la facilidad de uso y la flexibilidad del sistema al proporcionar una interfaz unificada para los subsistemas. Sin embargo, también es necesario ser consciente de las posibles deficiencias y riesgos al utilizar este modelo.

Si este modo te resulta útil, recuerda darle me gusta y recopilarlo.