어댑터 패턴(Adapter Pattern)
기존의 시스템과 연결된 시스템의 클래스가 서로 다르다면 중간에서 이를 변환해줄 어댑터가 필요함
public class TurkeyAdapter implements Duck{
Turkey turkey;
public TurkeyAdapter(Turkey turkey){
this.turkey = turkey;
}
public void quack(){
turkey.gobble();
}
public void fly(){
turkey.fly();
}
}
클라이언트(Turkey)를 타깃 인터페이스(Duck)로 변환해주는 어댑터 클래스이다.
public static void main(String[] args){
Turkey turkey = new Turkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
testDuck(turkeyAdapter); // turkey로 만든 turkeyAdapter가 정상작동
}
public static testDuck(Duck duck){
duck.quack();
duck.fly();
}
어댑터 패턴(Adapter Pattern)는 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환하여 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다.
데코레이터 패턴
어댑터 패턴과 마찬가리로 객체를 감쌈
But, 기존 코드 수정하지 않고 클래스에 새로운 행동 추가할 수 있음 + 인터페이스를 변환하지 않음
퍼사드(Facade) 패턴
서브 클래스를 캡슐화하지 않고, 서브 클래스의 기능을 사용할 수 있는 인터페이스를 제공하여 좀 더 편리하게 서브 클래스들의 기능을 사용할 수 있게 함
어댑터 패턴과는 용도가 다름! ( 인터페이스를 단순하게 vs 인터페이스를 변환 )
최소 지식 원칙(Principle of Least Knowledge)(= 데메테르의 법칙): 객체 사이의 상호작용은 될 수 있으면 가까운 사이에서 허용
지키기 위해 친구를 만들지 않는 가이드라인
- 객체 자체
- 메소드에 매개변수로 전달된 객체
- 메소드를 생성하거나 인스턴스를 만든 객체
- 객체에 속하는 구성 요소
=> 다른 메소드를 호출해서 리턴받은 객체의 메소드를 호출하는 일은 바람직하지 않음
=> 자바에서 일상적으로 사용하는 System.out.println() 호출도 이 원칙에 위배된다
// 원칙을 따르지 않는 경우
public float getTemp(){
Thermometer thermometer = station.getThermometer();
return thermometer.getTemperature();
}
// 원칙을 따르는 경우
public float getTemp(){
return station.getTemperature();
}
반응형
'독서 기록 > 디자인패턴' 카테고리의 다른 글
[디자인 패턴] 중재자 패턴 vs 옵저버 패턴 (0) | 2022.10.17 |
---|---|
[디자인패턴] 헤드퍼스트 디자인패턴 Chap.5 (Feat. 싱글톤 패턴) (0) | 2022.10.17 |
[디자인패턴] 헤드퍼스트 디자인패턴 Chap.4 (Feat.팩토리) (0) | 2022.10.10 |
[디자인패턴] 헤드퍼스트 디자인패턴 Chap.6 (Feat.커맨드 패턴) (0) | 2022.09.28 |
[디자인패턴] 헤드퍼스트 디자인패턴 Chap.2 (Feat.옵저버 패턴) (0) | 2022.09.23 |
댓글