퍼사드 패턴이란?
디자인 패턴 중 구조 패턴(Structural Patterns)에 속하는 패턴
"하위 시스템을 보다 쉽게 사용할 수 있게 해주는 고급 인터페이스"이다.
많은 분량의 코드에 접근할 수 있는 단순한 인터페이스를 제공한다.
서브시스템과의 상호작용 복잡도(결합도)를 낮추는 목적으로 사용된다.
- Facade : 사용자의 요청을 서브시스템 객체에 전달하는 단순하고 일관된 통합 인터페이스
- Subsystem : Facade에 대한 정보를 가지지 않고, 서브시스템의 기능을 구현하는 클래스
최소 지식 원칙(Principle of Least Knowledge)
객체 사이의 상호작용은 될 수 있으면 아주 가까운 '친구' 사이에서만 허용하는 것이 좋다.
- 시스템을 디자인할 때 어떤 객체든 그 객체와 상호작용을 하는 클래스의 개수와 상호작용 방식에 주의를 기울여야 한다는 뜻
최소 지식 원칙을 잘 따르면 여러 클래스가 복잡하게 얽혀 있어서, 시스템의 한 부분을 변경했을 때 다른 부분까지 줄줄이 고쳐야 하는 상황을 미리 방지할 수 있다.
퍼사드 패턴은 이런 최소 지식 원칙을 따르고 있다.
- 퍼사드가 클라이언트 대신 서브 시스템을 관리하고 있기 때문에 클라이언트는 퍼사드와 하나만의 관계를 가진다.
사용 예시
세탁기의 동작과정을 예시로 작성했다.
WashingMachine, Timer가 Subsystem의 역할이며 Facade 클래스만 접근할 수 있다.
클라이언트는 Facade 클래스에 접근하여 Subsystem을 이용할 수 있다.
WashingMachine Class
public class WashingMachine implements IWashingMachine {
public WashingMachine() {
}
@Override
public void on() {
System.out.println("세탁기의 전원이 켜졌습니다.");
}
@Override
public void off() {
System.out.println("세탁기의 전원이 꺼졌습니다.");
}
}
Timer Class
public class Timer implements ITimer{
public Timer() {
}
@Override
public void set(int time) throws InterruptedException {
System.out.println(time + "시간(초)이 설정되었습니다. 세탁이 시작됩니다.");
while(time > 0) {
System.out.println("종료까지 " + time + "시간(초) 남았습니다.");
Thread.sleep(1000);
time--;
}
end();
}
@Override
public void end() {
System.out.println("세탁이 완료되었습니다.");
}
}
Facade Class
public class Facade {
private WashingMachine washingMachine;
private Timer timer;
public Facade() {
washingMachine = new WashingMachine();
timer = new Timer();
}
public void on(int time) {
try {
washingMachine.on();
timer.set(time);
washingMachine.off();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Main Class
public class Main {
public static void main(String[] args) {
Facade facade = new Facade();
facade.on(5);
}
}
위와 같이 Facade Pattern을 적용하면 클라이언트는 Subsystem으로부터 분리되어 Subsystem에 의존하지 않아도 된다.
'CS > 디자인 패턴' 카테고리의 다른 글
Visitor Pattern 방문자 패턴 (3) | 2022.10.13 |
---|