반응형

참고 및 출처 ::

 - http://www.buggymind.com/36

 - http://pupustory.tistory.com/161



* Facade Pattern (퍼사드 패턴)

 - 어떤 서브 시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다.

 - 퍼사드에서 고수준의 인터페이스를 정의하기 때문에 서브 시스템을 더 쉽게 사용할 수 있다.

퍼사드 패턴은 디자인 원칙의 최소 지식 원칙을 준수하는 패턴으로써 클라이언트를 복잡한 서브 시스템과 분리시켜주는 역할을 한다. 무슨 말인고 하니, 서브 시스템을 가지고 퍼사드를 만들고 실제 작업은 서브 클래스에 맡긴다는 뜻이다.



* 예제

어항을 청소한다고 생각해보자. 먼저 물고기를 옮기고, 어항 안에 악세사리를 꺼내고, 물을 제거한 후 어항을 청소하고, 다시 악세사리를 넣고 물을 채우고 물고기를 넣는다. 이를 메소드 호출로 생각한다면 아래와 같을 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 물고기를 꺼내고
getFish();
 
// 악세사리를 꺼내고
getDecorator();
 
// 물을 비우고
getWater();
 
// 어항을 청소하고
wash();
 
// 악세사리를 설치하고
setDecorator();
 
// 물을 넣고
setWater();
 
// 물고기를 넣는다.
setFish();

이러한 어항 청소 프로세스를 하나의 메소드 또는 인터페이스로 정의한 다음 서브 시스템에서 최소한의 지식만 가지고 사용할 수 있도록 하는 것이 퍼사드 패턴이다.




* 퍼사드 패턴 적용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
doWash() {
    // 물고기를 꺼내고
    getFish();
 
    // 악세사리를 꺼내고
    getDecorator();
 
    // 물을 비우고
    getWater();
 
    // 어항을 청소하고
    wash();
 
    // 악세사리를 설치하고
    setDecorator();
 
    // 물을 넣고
    setWater();
 
    // 물고기를 넣는다.
    setFish();
}
 

물론 많은 부분이 생략되었지만 아래 다이어로그램을 참고한다면 어떤식으로 적용해야 할지 알 것이다.


실제로 퍼사드 패턴은 우리가 이미 자주 사용하고 있는 패턴 중 하나이다. 클라이언트는 캡슐화된 프로세스 내의 동작을 알 필요 없이 해당 인터페이스가 요구하는 정보만 넣어서 호출하면 원하는 결과를 얻을 수 있도록 한다. 한 마디로 복잡한 클래스들과 패키지들을 어떤 단순한 인터페이스 객체 뒤에 감추는 것이다. 


예를 들어 Java의 Date 클래스는 사실 사용하기가 좀 까다롭다. 그런 복잡한 사용 방법은 전부 다 감추고, 사용자로 하여금 단순히 '현재 날짜에 며칠을 더하면 언제가 되는지' 알려주는 인터페이스만 주고 싶다고 하자.

그러면 퍼사드 클래스를 설계해서, 그 클래스가 내부적으로 Date 클래스나 기타 관련 클래스들을 조작하게 한 다음, 퍼사드 클래스가 제공하는 인터페이스만 사용하도록 하면 된다. 결국 이렇게 해서 만들어진 퍼사드 클래스는 Date 클래스에 대한 '대안적'인 인터페이스가 되는 것이다.


따라서 퍼사드 패턴은 어떻게 보면 어댑터 패턴하고도 비슷하나 Adaptation할 기능의 규모가 좀 더 큰 경우에 보다 적합하다고도 할 수 있다.


출처 : 

http://warmz.tistory.com/764

반응형

+ Recent posts