Compartilhamento de tecnologia

Padrão de design de fachada

2024-07-12

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

O padrão de design de fachada, também conhecido como padrão de aparência, é um padrão de design estrutural usado principalmente para fornecer uma interface unificada de alto nível para um conjunto de interfaces em um subsistema, tornando o subsistema mais fácil de usar. A seguir está uma introdução detalhada ao padrão de design Facade:

1. Definição

O padrão Façade fornece uma interface externa para vários subsistemas complexos, facilitando o acesso a esses subsistemas. Este modo possui uma interface unificada com o mundo externo, e os aplicativos externos não precisam se preocupar com os detalhes internos do subsistema, reduzindo bastante a complexidade do aplicativo e melhorando a capacidade de manutenção.

2. Motivo e propósito

  • Reduza a complexidade: Ao encapsular a complexidade do subsistema na classe Façade, o cliente pode chamar o subsistema por meio de uma interface simples sem ter que entender profundamente a implementação específica do subsistema.
  • Melhore a facilidade de uso: O modo Façade fornece uma interface simples para que os clientes possam usar o subsistema com mais facilidade.
  • acoplamento solto: Ao introduzir a classe Façade, o acoplamento entre o cliente e o subsistema é reduzido, de modo que as alterações dentro do subsistema não afetarão o cliente.

3. Estrutura e diagrama de classes

Diagrama de Classe:

O modo Fachada inclui principalmente as três funções a seguir:

  • Fachada (papel de aparência) : O cliente pode chamar os métodos desta função. As classes de fachada estão cientes das funções e responsabilidades do(s) subsistema(s) associado(s). Em circunstâncias normais, esta função delegará todas as solicitações enviadas do cliente ao subsistema correspondente.
  • Subsistema (função do subsistema) : pode haver um ou mais subsistemas ao mesmo tempo. Cada subsistema não é uma classe separada, mas uma coleção de classes. Cada subsistema pode ser chamado diretamente pelo cliente ou pela função de aparência. O subsistema não sabe da existência da aparência. Para o subsistema, a aparência é apenas mais um cliente.
  • Cliente (função de cliente): O usuário chama a função do subsistema por meio da classe de aparência.

4. Vantagens e Desvantagens

vantagem
  1. Reduza a complexidade do sistema: Ao fornecer uma interface simples para subsistemas, torna mais fácil para os clientes entenderem e usarem o sistema.
  2. Melhore a flexibilidade do sistema: Quando ocorrem alterações no subsistema, apenas a classe Façade precisa ser modificada, sem modificar o código do cliente.
  3. Cumpra a Lei de Deméter: Ao introduzir a classe Façade, a dependência entre o cliente e o subsistema é reduzida.
deficiência
  1. Adicionar subsistemas ou estender o comportamento do subsistema pode facilmente introduzir riscos: Como todas as solicitações precisam ser encaminhadas por meio da classe Facade, se a classe Facade não for projetada corretamente, novos riscos poderão ser introduzidos.
  2. Não cumpre o princípio aberto-fechado: Em alguns casos, se for necessário estender o sistema, pode ser necessário modificar o código da classe Façade, o que viola o princípio aberto-fechado (ou seja, aberto a extensões, fechado a modificações).

5. Cenários de aplicação

  • O modo fachada pode ser usado quando o sistema precisa fornecer uma interface simples para o mundo exterior.
  • O padrão fachada pode ser usado quando o sistema precisa ocultar a complexidade dos subsistemas.
  • Quando você precisar construir uma estrutura de sistema multicamadas, poderá usar o objeto Façade como entrada para cada camada para simplificar as chamadas de camada.

6. Exemplos de implementação

Em um sistema de home theater, o modo Façade pode ser usado para simplificar as operações do usuário. Por exemplo, os usuários só precisam usar um controle remoto (classe Facade) para controlar projetores, alto-falantes, reprodutores de DVD e outros dispositivos (subsistemas) sem ter que operar esses dispositivos separadamente.

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

Neste exemplo, você pode ver o modo fachada, que é particularmente adequado para usar múltiplos componentes para montar processos fixos e reduzir a complexidade das chamadas dos clientes.

7. Resumo

O padrão de design Façade é um padrão de design muito prático que reduz a complexidade do sistema e melhora a facilidade de uso e flexibilidade do sistema, fornecendo uma interface unificada para subsistemas. No entanto, você também precisa estar ciente das possíveis deficiências e riscos ao usar este modelo.

Se este modo for útil para você, lembre-se de curtir e colecioná-lo.