Обмен технологиями

Схема оформления фасада

2024-07-12

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

Шаблон проектирования фасада, также известный как шаблон внешнего вида, представляет собой шаблон структурного проектирования. Он в основном используется для обеспечения унифицированного высокоуровневого интерфейса для набора интерфейсов в подсистеме, тем самым упрощая использование подсистемы. Ниже приводится подробное введение в шаблон проектирования «Фасад»:

1. Определение

Шаблон «Фасад» предоставляет внешний интерфейс для множества сложных подсистем, упрощая доступ к этим подсистемам. Этот режим имеет унифицированный интерфейс с внешним миром, и внешним приложениям не нужно заботиться о внутренних деталях подсистемы, что значительно снижает сложность приложения и улучшает удобство обслуживания.

2. Мотив и цель

  • Уменьшите сложность: Инкапсулируя сложность подсистемы в классе Facade, клиент может вызывать подсистему через простой интерфейс без необходимости глубоко понимать конкретную реализацию подсистемы.
  • Улучшите удобство использования: Фасадный режим предоставляет простой интерфейс, упрощающий использование подсистемы клиентами.
  • Слабая связь: введение класса Facade снижает связь между клиентом и подсистемой, поэтому изменения внутри подсистемы не влияют на клиента.

3. Структура и диаграмма классов

Диаграмма классов:

Фасадный режим в основном включает в себя следующие три роли:

  • Фасад (роль внешнего вида) : Клиент может вызывать методы этой роли. Фасадные классы осведомлены о функциях и обязанностях связанных подсистем. В обычных обстоятельствах эта роль будет делегировать все запросы, отправленные от клиента, соответствующей подсистеме.
  • Подсистема (роль подсистемы) : Одновременно может существовать одна или несколько подсистем. Каждая подсистема представляет собой не отдельный класс, а совокупность классов. Каждая подсистема может быть вызвана непосредственно клиентом или ролью внешнего вида. Подсистема не знает о существовании внешнего вида. Для подсистемы внешний вид — это просто еще один клиент.
  • Клиент (роль клиента): Пользователь вызывает функцию подсистемы через класс внешнего вида.

4. Преимущества и недостатки

преимущество
  1. Уменьшите сложность системы: Предоставляя простой интерфейс для подсистем, клиентам становится легче понимать и использовать систему.
  2. Повышение гибкости системы: Когда изменения происходят внутри подсистемы, необходимо изменить только класс Facade, не изменяя клиентский код.
  3. Соблюдайте закон Деметры: Благодаря введению класса Facade зависимость между клиентом и подсистемой снижается.
недостаток
  1. Добавление подсистем или расширение поведения подсистемы может легко привести к рискам.: поскольку все запросы должны пересылаться через класс Facade, если класс Facade спроектирован неправильно, могут возникнуть новые риски.
  2. Не соответствует принципу открытия-закрытия: В некоторых случаях при необходимости расширения системы может потребоваться модификация кода класса Facade, что нарушает принцип открытости-закрытости (то есть открыт для расширений, закрыт для модификаций).

5. Сценарии применения

  • Фасадный режим можно использовать, когда системе необходимо обеспечить простой интерфейс с внешним миром.
  • Шаблон фасада можно использовать, когда системе необходимо скрыть сложность подсистем.
  • Когда вам нужно построить многоуровневую структуру системы, вы можете использовать объект Фасад в качестве входа на каждый уровень, чтобы упростить вызовы слоев.

6. Примеры реализации

В системе домашнего кинотеатра режим «Фасад» можно использовать для упрощения операций пользователя. Например, для управления проекторами, колонками, DVD-плеерами и другими устройствами (подсистемами) пользователям достаточно одного пульта (класса «Фасад») без необходимости управлять этими устройствами по отдельности.

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

В этом примере вы можете увидеть фасадный режим, который особенно подходит для использования нескольких компонентов для сборки фиксированных процессов и снижения сложности клиентских вызовов.

7. Резюме

Шаблон проектирования «Фасад» — это очень практичный шаблон проектирования, который снижает сложность системы, повышает ее простоту использования и гибкость за счет предоставления унифицированного интерфейса для подсистем. Однако вам также необходимо осознавать возможные недостатки и риски при использовании этой модели.

Если этот мод вам полезен, не забудьте поставить лайк и собрать его.