# 퍼사드 패턴
## 정의
- 서브시스템에 있는 일련의 인터페이스에 대한 통합 인터페이스를 제공
- 서브시스템을 더 쉽게 사용할 수 있게 해주는 고수준 인터페이스 정의
## 특징
- 다른 패턴과 비교
- 데코레이터 - 인터페이스는 바꾸지 않고 책임(기능)만 추가
- 어댑터 - 한 인터페이스를 다른 인터페이스로 변환
- 퍼사드 - 일련의 객체들을 감싸서 단순화
### 최소 지식 원칙
- 꼭 필요한 최소한의 객체와만 상호작용하라
- 객체 자체
- 메서드에 매개변수로 전달된 객체
- 메서드에서 생성한 객체
- 객체에 속하는 구성요소
- 여러 클래스들이 복잡하게 얽혀서 시스템의 한 부분을 변경했을 때 다른 부분까지 줄줄이 고쳐야 하는 상황을 미리 방지
- 객체들 사이의 의존성을 줄일 수 있지만, 다른 구성요소에 대한 메서드 호출을 처리하기 위한 래퍼 클래스가 많아져 시스템이 복잡해질 수 있음
## 장단점
### 장점
- 단순화된 인터페이스를 제공하면서도, 클라이언트에서 필요로 한다면 시스템의 모든 기능을 사용할 수 있도록 해 줌
- 클라이언트 구현과 퍼사드 내부 구현(서브시스템)을 분리할 수 있음(최소 지식 원칙)
### 단점
- 다른 구성요소에 대한 메소드 호출을 처리하기 위해 "래퍼" 클래스를 많이 만들어야 할 수 있음
### 단점을 해결할 순 없을까..?
- 꼭 필요할때만 사용하고 객체 설계를 잘하자!
## 예시
- 큰 인터페이스, 또는 여러 인터페이스를 단순화시키거나 통합시켜야 할 때
- 하위 시스템의 추상화, 구현이 밀접하게 결합되어 있을 때
- 각각의 소프트웨어 계층에 진입점이 필요할 때
- 컴퓨터 - CPU, Memory, HardDrive
## Code
## Reference
- Head First Design Patterns