독서 기록/디자인패턴

[디자인패턴] 헤드퍼스트 디자인패턴 Chap.7 (Feat.어댑터, 퍼사드 패턴)

JoJobum 2022. 10. 10.

어댑터 패턴(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();
}

 

반응형

댓글