[Book]Design Pattern 7장
어댑터 패턴
클라이언트에서 어댑터를 사용하는 방법
- 클라이언트에서 타켓 인터페이스를 사용하여 메소드를 호출함으로써 어댑터에 요청을 합니다.
- 어댑터에서는 어댑티 인터페이스를 사용하여 그 요청을 어댑티에 대한 (하나 이상의) 메소드 호출로 변환합니다.
- 클라이언트에서는 호출 결과를 받긴 하지만 중간에 어댑터가 껴 있는지는 전혀 알지 못합니다.
Duck을 Turkey로 변환해주는 어댑터 만들기
public class DuckAdapter implements Turkey {
Duck duck;
public DuckAdapter(Duck duck) {
this. duck = duck;
}
public void gobble(){
duck.quack();
}
public void fly() {
duck.fly();
}
}
정의
- 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다.
객체와 클래스 어댑터
- 어댑터에는 두 종류가 있다. 객체 어댑터와 클래스 어댑터
- 클래스 어댑터를 쓰려면 다중 상속이 필요한데, 자바는 다중 상속이 안되기 때문에 책에서 심도있게 다루지는 않는다.
데코레이터, 어댑터, 퍼사드 패턴의 차이
- 데코레이터 패턴 : 인터페이스는 바꾸지 않고 책임(기능)만 추가
- 어댑터 패턴 : 한 인터페이스를 다른 인터페이스로 변환
- 퍼사드 패턴 : 인터페이스를 간단하게 바꿈
퍼사드 패턴
- 퍼사드는 인터페이스를 단순화시킬 뿐 아니라 클라이언트와 구성요소들로 이루어진 서브시스템을 분리시키는 역할도 합니다.
- 퍼사드와 어댑터는 모두 여러개의 클래스를 감쌀 수 잇습니다. 하지만 퍼사드는 인터페이스를 단순화시키기 위한 용도로 쓰이는 반면, 어댑터는 인터페이스를 다른 인터페이스로 변환하기 위한 용도로 쓰입니다.
정의
- 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공합니다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있습니다.
디자인 원칙
- 최소 지식 원칙 - 정말 친한 친구하고만 얘기하라
→ 시스템을 디자인 할 때, 어떤 객체든 그 객체와 상호작용을 하는 클래스의 개수에 주의해야 하며, 그런 객체들과 어떤 식으로 상호작용을 하는지에도 주의를 기울여야 한다는 뜻.
어떻게 친구를 만들이 않으면서 다른 객체에 영향을 줄 수 있을까?
- 어떤 메소드에서든지 다음 네 종류의 객체의 메소드만을 호출하면 됩니다.
- 객체 자체
- 메소드에 매개변수로 전달된 객체
- 그 메소드에서 생성하거나 인스턴스를 만든 객체
- 그 객체에 속하는 구성요소
댓글남기기