기술나눔

외관 디자인 패턴

2024-07-12

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

외관 패턴이라고도 알려진 파사드 디자인 패턴은 주로 서브시스템의 인터페이스 세트에 대해 통합된 상위 수준 인터페이스를 제공하여 서브시스템을 더 쉽게 사용할 수 있도록 하는 데 사용됩니다. 다음은 Facade 디자인 패턴에 대한 자세한 소개입니다.

1. 정의

Facade 패턴은 여러 복잡한 하위 시스템에 대한 외부 인터페이스를 제공하여 이러한 하위 시스템에 더 쉽게 액세스할 수 있도록 합니다. 이 모드에는 외부 세계에 대한 통합 인터페이스가 있으며 외부 애플리케이션은 하위 시스템의 내부 세부 사항에 신경 쓸 필요가 없으므로 애플리케이션의 복잡성이 크게 줄어들고 유지 관리성이 향상됩니다.

2. 동기와 목적

  • 복잡성 감소: 서브시스템의 복잡성을 Facade 클래스에 캡슐화함으로써 클라이언트는 서브시스템의 구체적인 구현을 깊이 이해하지 않고도 간단한 인터페이스를 통해 서브시스템을 호출할 수 있습니다.
  • 사용 편의성 향상: Facade 모드는 클라이언트가 서브시스템을 보다 쉽게 ​​사용할 수 있도록 간단한 인터페이스를 제공합니다.
  • 느슨한 결합: Facade 클래스를 도입함으로써 클라이언트와 서브시스템 간의 결합이 줄어들어 서브시스템 내의 변경 사항이 클라이언트에 영향을 미치지 않습니다.

3. 구조 및 클래스 다이어그램

클래스 다이어그램:

파사드 모드에는 주로 다음 세 가지 역할이 포함됩니다.

  • Facade (외모 역할) : 클라이언트는 이 역할의 메서드를 호출할 수 있습니다. Facade 클래스는 관련 하위 시스템의 기능과 책임을 알고 있습니다. 일반적인 상황에서 이 역할은 클라이언트에서 보낸 모든 요청을 해당 하위 시스템에 위임합니다.
  • 하위 시스템(하위 시스템 역할) : 동시에 하나 이상의 하위 시스템이 있을 수 있습니다. 각 하위 시스템은 별도의 클래스가 아니라 클래스 모음입니다. 각 하위 시스템은 클라이언트 또는 모양 역할에 의해 직접 호출될 수 있습니다. 하위 시스템은 모양의 존재를 알지 못합니다. 하위 시스템에게 모양은 또 다른 클라이언트일 뿐입니다.
  • 클라이언트(클라이언트 역할): 사용자는 Appearance 클래스를 통해 하위 시스템의 기능을 호출합니다.

4. 장점과 단점

이점
  1. 시스템 복잡성 감소: 서브시스템에 대한 간단한 인터페이스를 제공함으로써 클라이언트가 시스템을 보다 쉽게 ​​이해하고 사용할 수 있도록 합니다.
  2. 시스템 유연성 향상: 서브시스템 내에서 변경이 발생할 경우 클라이언트 코드 수정 없이 Facade 클래스만 수정하면 됩니다.
  3. 데메테르의 법칙을 따르세요: Facade 클래스를 도입함으로써 클라이언트와 서브시스템 간의 종속성이 줄어듭니다.
결점
  1. 하위 시스템을 추가하거나 하위 시스템 동작을 확장하면 쉽게 위험이 발생할 수 있습니다.: 모든 요청은 Facade 클래스를 통해 전달되어야 하기 때문에 Facade 클래스가 제대로 설계되지 않으면 새로운 위험이 발생할 수 있습니다.
  2. 개방-폐쇄 원칙을 준수하지 않음: 경우에 따라 시스템을 확장해야 하는 경우 Facade 클래스의 코드를 수정해야 할 수도 있습니다. 이는 개방형 폐쇄 원칙(즉, 확장에는 개방, 수정에는 폐쇄)을 위반하는 것입니다.

5. 응용 시나리오

  • 파사드 모드는 시스템이 외부 세계에 간단한 인터페이스를 제공해야 할 때 사용할 수 있습니다.
  • 파사드 패턴은 시스템이 하위 시스템의 복잡성을 숨겨야 할 때 사용할 수 있습니다.
  • 다중 레이어 시스템 구조를 구축해야 하는 경우 Facade 객체를 각 레이어의 입구로 사용하여 레이어 호출을 단순화할 수 있습니다.

6. 구현 예

홈 시어터 시스템에서는 Facade 모드를 사용하여 사용자 작업을 단순화할 수 있습니다. 예를 들어, 사용자는 프로젝터, 스피커, DVD 플레이어 및 기타 장치(하위 시스템)를 별도로 작동할 필요 없이 하나의 리모컨(Facade 클래스)만 사용하면 됩니다.

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

이 예에서는 여러 구성 요소를 사용하여 고정 프로세스를 조합하고 클라이언트 호출의 복잡성을 줄이는 데 특히 적합한 Facade 모드를 볼 수 있습니다.

7. 요약

Facade 디자인 패턴은 하위 시스템에 대한 통합 인터페이스를 제공하여 시스템 복잡성을 줄이고 시스템 사용 편의성과 유연성을 향상시키는 매우 실용적인 디자인 패턴입니다. 그러나 이 모델을 사용할 때 발생할 수 있는 단점과 위험도 알고 있어야 합니다.

이 모드가 유용하다면 좋아요와 수집을 잊지 마세요.