Facade패턴 (2)
의도
● 복잡하게 얽혀 있는 클래스나 서브시스템간의 인터페이스를 정리하여 클라이언트 측에서
사용하기 쉽도록 포괄적이고 한 단계 높은 수준의 인터페이스를 제공함
● 서브시스템의 복잡한 인터페이스를 단순화된 하나의 통합 인터페이스로 제공
동기
이런 식으로 구성된 클래스라 하면 ClientClass에서 사용해야 하는 클래스나 메소드가 많아 사용방법이나 호출순서에도 신경을 많이 써야 함
Facade패턴을 이용하여 내부에서 작동하고 있는 많은 클래스들의 관계나 사용법을 의식하지 않고 Facade에서 제공하는 단순화된 하나의 인터페이스를 이용하여 같은 결과를 얻을 수 있음
구조
참여객체
○ Facade : 단순하고 일관된 통합 인터페이스 제공
- 서브시스템의 어떤 클래스가 어떤 요청을 처리해야 하는지 알고 있으며 클라이언트의
각 요청을 해당하는 서브시스템 객체에 전달
○ subsystem classes : 서브시스템의 기능성을 구현
- Facade객체에서 할당한 작업을 실제로 처리
- Facade에 대한 아무런 정보도 가지고 있지 않음
협력방법
● 클라이언트는 Facade의 인터페이스를 이용해서 서브시스템과 상호작용하므로 Facade에는
클라이언트로부터의 요청을 서브시스템의 적당한 객체에게 전달 할 수 있는 클라이언트 요청
에 대한 작업을 미리 정의하고 있어야 함
● Facade를 사용하는 클라이언트는 서브시스템의 객체로 직접 접근할 필요가 없음
활용성
○ 복잡한 서브시스템에 대한 단순화 된 인터페이스 제공이 필요할 때
→ 재사용성과 확장성을 고려하여 설계해 복잡해진 각각의 클래스들을 다 이해하면서 서브시
스템을 사용할 필요가 없는 개발자들에게 단순하면서도 기본적인 인터페이스 만을 제공
○ 클라이언트와 구현클래스 간의 너무 많은 종속성이 존재할 때
→ Facade의 사용으로 클라이언트와 다른 서브시스템 간의 결합도를 줄일 수 있으므로
클라이언트와 서브시스템 사이의 종속성을 감소 시킬 수 있음
○ 서브시스템들의 계층화를 이루고자 할 때
→ Facade는 각 서브시스템의 계층별 접근을 제공할 수 있으므로 서브시스템과 서브시스템
간의 종속성이 있다 하더라도 Facade를 통해서만 교류하게 함으로써 서브시스템간의 종속
성을 줄일 수 있음
☞ 서브시스템 내부 설계의 변경이 다른 서브시스템에 독립적으로 자유롭게 이루어질 수 있다
결과
1. 클라이언트가 다루어야 할 객체의 수가 줄어들므로 서브시스템의 구성요소를 보호할 수 있다
2. 서브시스템과 클라이언트 코드의 결합도를 줄일 수 있다
서브시스템과 클라이언트간의 결합도가 낮으면 서브시스템 내 요소를 다양화 하는 작업이 원활
해 지므로 서브시스템내에서는 결합도가 더 강해질 수 있다.
3. 서브시스템의 클래스를 사용하는 것을 완전히 막지는 않는다.
Facade를 사용할지 서브시스템의 클래스를 사용할지는 직접 결정할 수 있다.
확장
여러 개의 서브시스템과 Facade가 있을 때 이를 다시 Facade를 구성함으로써 더욱더 클라이언트와 서브시스템간의 의존성을 줄일수 있다.
Facade를 추상클래스로 정의하고 이를 상속하는 클래스를 정의하여 서브시스템마다 다른 구현을 하게 함으로써도 확장이 가능하다.
출처: http://blog.naver.com/PostView.nhn?blogId=whistle96&logNo=140005491925