# 설명
Facade의 뜻은 건물의 정면이라는 뜻이다. 왜 퍼사드 패턴은 퍼사드라는 이유를 붙였을까?
클라이언트가 어떠한 System을 이용하기 위해서는 여러 SubSystem이 유기적으로 연결된 내부를 알아야한다고 생각해보자. 자동차 시동을 걸기 위해서 자동차의 엔진의 작동방식, 미션의 작동방식 등등을 알아야한다면 자동차를 탈 수 있는 사람은 누가 있을까? 우리는 단순하게 버튼을 눌러 시동을 걸기만 하면 된다. Facade패턴은 이런 키와 같은 역할을 하게 해준다. 서브시스템을 합성하여 사용하는 다수 객체 집합에 대해서 Facade에서 구현하고 Client는 인터페이스를 제공받아 사용하기만 하면 되는 것이다.
즉, Facade의 어원을 다시 생각해보면 우리는 건물의 정면만을 보는 것이다. 건물안은 뭐가 있는지 어떻게 생겼는지도 모르는거와 같다.
컴파일러 시스템은 이러한 Facade패턴으로 이루어져있다. Compiler가 내부의 복잡한 관계를 구현하고 사용자에게 인터페이스를 제공한다.
이로인하여, 우리는 클라이언트와 서브시스템간의 결합도를 줄일 수 있다.
# 예제
- 간단한 햄버거 예제를 살펴본다.
- 햄버거를 만들기 위해선 번(buns), 패티(patty), 야채(vegetable), Assemble(조합)의 subClass를 통하여 만들어진다.
- 각각의 클래스에는 손질, 굽기 등등 일련의 과정이 필요하다.
- 하지만 햄버거를 만들어주는 기계(Facade)를 통하여 햄버거를 손쉽게 만들 수 있다.
# 코드
// Buns
public class Buns {
public void burn(){
System.out.println("---번(빵)을 굽습니다.---");
}
}
// Patty
public class Patty {
public void ready(){
System.out.println("---패티(고기)를 다집니다.");
}
public void grill(){
System.out.println("---패티(고기)를 굽습니다");
}
}
// Vegetable
public class Vegetable {
public void wash(){
System.out.println("---야채를 씻습니다.---");
}
public void hand(){
System.out.println("---야채를 손질합니다.---");
}
}
// Assemble
public class Assemble {
Buns buns;
Patty patty;
Vegetable vege;
public Assemble(Buns buns, Patty patty, Vegetable vege){
this.buns = buns;
this.patty = patty;
this.vege = vege;
}
public void complete(){
System.out.println("buns + patty + vegetable을 이용해 햄버거를 완성했습니다.");
}
}
## Facade
내부 구조는 모르지만, makeHambuger()를 호출하여 햄버를 만들 수 있다.
public class Facade {
private Buns buns;
private Patty patty;
private Vegetable vege;
private Assemble assemble;
Facade(){
buns = new Buns();
patty = new Patty();
vege = new Vegetable();
assemble = new Assemble(buns,patty,vege);
}
public void makeHambuger(){
buns.burn();
patty.ready();
patty.grill();
vege.wash();
vege.hand();
assemble.complete();
}
}
# 결과
public class Client {
public static void main(String[] args) {
// 퍼사드 패턴을 사용하지 않는 경우
Buns buns = new Buns();
Patty patty = new Patty();
Vegetable vegetable = new Vegetable();
buns.burn();
patty.ready();
patty.grill();
vegetable.wash();
vegetable.hand();
Assemble hambuger = new Assemble(buns,patty,vegetable);
hambuger.complete();
System.out.println("");
System.out.println("@@@@@@@Facade 패턴을 이용합니다.@@@@@@@");
// Facade 이용
Facade hambugerMaker = new Facade();
hambugerMaker.makeHambuger();
}
}
'• 독서 > Design Pattern' 카테고리의 다른 글
[클린소프트웨어#1] 애자일(Agile) 방법론과 4가지 가치와 12개의 원칙 (0) | 2022.10.18 |
---|---|
[디자인패턴] 중재자 패턴(Mediator Pattern) (0) | 2022.10.11 |
[디자인 패턴] 메멘토 패턴(Memento Pattern) (0) | 2022.10.10 |
[디자인 패턴] 옵저버 패턴(Observer Pattern) (1) | 2022.10.04 |
[디자인 패턴] 스테이트 패턴(State Pattern) (0) | 2022.10.02 |