디자인패턴 Facade Pattern
퍼사드 클래스에서는 서브시스템 클래스들을 캡슐화하지 않습니다.
그냥 서브시스템의 기능을 사용할 수 있는 간단한 인터페이스를 제공할 뿐입니다.
Facade Pattern은 실제로 어떻게 적용할까요?
어떤 일을 하기 위해서는 작업 순서가 있습니다.
하지만 그 작업 순서를 하나씩 동작하기엔 너무 복잡하지 않을까요?
복잡한 작업 순서들을 하나로 묶어서 사용할 수 있게 된다면 편리하지 않을까요?
이런 경우에 퍼사드 패턴을 사용하면 됩니다.
퍼사드 클래스를 구현함으로써 복잡한 시스템을 훨씬 쉽게 사용할 수 있습니다.
퍼사드는 인터페이스를 단순화시킬 뿐 아니라 클라이언트와 구성요소들로 이루어진 서브시스템을 분리시키는 역할도 합니다.
세차하는 시스템을 퍼사드로 구현
세차를 할 때 작업 순서가 있습니다.
-카 샴푸 사용
-세차용 스펀지로 닦기
-물통에 세차용 스펀지 세척하기
-휠 브러시 사용하기
-고압수 뿌리기
-타월을 사용하여 물기 제거하기
이 작업 순서를 매번 하나씩 동작한다면 번거롭기도 하고, 복잡하기도 합니다.
더 간편한 방법이 있을지 찾아봅니다.
그래서 위의 작업 순서들을 하나로 묶기로 했습니다.
세차를 할 때 복잡하던 작업 순서들을 하나로 묶었습니다.
기존에는 각 클래스를 하나씩 동작해야 했다면, 이제는 CarWash라는 클래스로 기능들을 묶어서 한 번만 사용하면 됩니다.
구현
BubbleBomb
package cg.park.designpattern.facade;
public class BubbleBomb {
String description;
public BubbleBomb(String description) {
this.description = description;
}
public void on() {System.out.println(description + " 샴푸 on");}
public void off() {
System.out.println(description + " 샴푸 off");
}
}
WashMitt
package cg.park.designpattern.facade;
public class WashMitt {
String description;
public WashMitt(String description) {
this.description = description;
}
public void on() {
System.out.println(description + " 세차용 스폰지 on");
}
public void off() {
System.out.println(description + " 세차용 스폰지 off");
}
}
WheelBrush
package cg.park.designpattern.facade;
public class WheelBrush {
String description;
public WheelBrush(String description) {
this.description = description;
}
public void on() {
System.out.println(description + " 휠 브러시 on");
}
public void off() {
System.out.println(description + " 휠 브러시 off");
}
}
Bucket
package cg.park.designpattern.facade;
public class Bucket {
String description;
public Bucket(String description) {
this.description = description;
}
public void on() {
System.out.println(description + " 물통에 스폰지 세척 on");
}
public void off() {
System.out.println(description + " 물통에 스폰지 세척 off");
}
}
PressureWasher
package cg.park.designpattern.facade;
public class PressureWasher {
String description;
public PressureWasher(String description) {
this.description = description;
}
public void on() {
System.out.println(description + " 고압수 뿌리기 on");
}
public void off() {
System.out.println(description + " 고압수 뿌리기 off");
}
}
Towel
package cg.park.designpattern.facade;
public class Towel {
String description;
public Towel(String description) {
this.description = description;
}
public void on() {
System.out.println(description + " 타월로 물기 제거 on");
}
public void off() {
System.out.println(description + " 타월로 물기 제거 off");
}
}
CarWash
package cg.park.designpattern.facade;
public class CarWash {
BubbleBomb bubbleBomb;//카 샴푸
Bucket bucket;//물통
PressureWasher pressureWasher;//고압 세척기
Towel towel;//타월
WashMitt washMitt;//세차용 스폰지
WheelBrush wheelBrush;//휠 브러시
public CarWash(
BubbleBomb bubbleBomb
, Bucket bucket
, PressureWasher pressureWasher
, Towel towel
, WashMitt washMitt
, WheelBrush wheelBrush) {
this.bucket = bucket;
this.washMitt = washMitt;
this.wheelBrush = wheelBrush;
this.bubbleBomb = bubbleBomb;
this.towel = towel;
this.pressureWasher = pressureWasher;
}
public void start() {
bubbleBomb.on();//카 샴푸
washMitt.on();//세차용 스폰지
wheelBrush.on();//휠 브러시
bucket.on();//물통
pressureWasher.on();//고압수 뿌리기
towel.on();//타월을 이용하여 물기 제거
}
public void end() {
bubbleBomb.off();
wheelBrush.off();
washMitt.off();
bucket.off();
pressureWasher.off();
towel.off();
}
}
FacadeTest
package cg.park.designpattern.facade;
public class FacadeTest {
public static void main(String[] args) {
BubbleBomb bubbleBomb = new BubbleBomb("A사 제품");
Bucket bucket = new Bucket("A사 제품");
PressureWasher pressureWasher = new PressureWasher("A사 제품");
Towel towel = new Towel("A사 제품");
WashMitt washMitt = new WashMitt("A사 제품");
WheelBrush wheelBrush = new WheelBrush("A사 제품");
CarWash carWash = new CarWash(
bubbleBomb
, bucket
, pressureWasher
, towel
, washMitt
, wheelBrush);
carWash.start();//세차 시작
System.out.println("=================================");
carWash.end();//세차 종료
}
}
후기
처음에는 퍼사드패턴과 커맨드 패턴이 헷갈렸습니다.
퍼사드 패턴과 커맨드 패턴 둘 다 공부하니 개념적인 차이를 이해했습니다.
퍼사드 패턴: 서브클래스들을 캡슐화하지 않고 구현, 훨씬 쉽게 사용할 수 있는 인터페이스를 제공함으로써 복잡한 시스템을 쉽게 사용.
커맨드 패턴: 요구사항을 객체로 캡슐화, 매개변수로 다른 여러 가지 요구사항 추가 가능.
Git: https://github.com/qkrcksrbs8/designpattern
참조 자료: Head First Design Patterns
'스프링 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] Iterator Pattern 이터레이터 패턴 (0) | 2022.01.21 |
---|---|
[디자인패턴] TemplateMethod Pattern (0) | 2022.01.15 |
[디자인패턴] Adapter Pattern (0) | 2022.01.11 |
[디자인패턴] Command Pattern (0) | 2022.01.09 |
[디자인패턴] Singleton Pattern (0) | 2022.01.08 |