Java/Design Pattern

[헤드퍼스트 디자인 패턴] 7-1. 어댑터 패턴

noahkim_ 2024. 12. 17. 19:05

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다

 

1. 어댑터 패턴

  • 호환되지 않는 인터페이스를 클라이언트가 기대하는 인터페이스로 변환해주는 디자인 패턴
  • 기존 클래스를 수정하지 않고, 재사용할 수 있게 도와줌

 

2. 예제: 오리

Duck

예제) Duck

더보기
public interface Duck {
    void quack();
    void fly();
}
public class MallardDuck implements Duck {
    public void quack() { System.out.println("꽥"); }    
    public void fly() { System.out.println("날고 있어요!"); }
}

 

Turkey

예제) Turkey

더보기
public interface Turkey {
    void gobble();
    void fly();
}
public class WildTurkey implements Turkey {
    void gobble() { System.out.println("골골"); }
    void fly() { System.out.println("짧은 거리를 날고 있어요!"); } 
}

 

Adapter

  • Composition: adaptee 인스턴스가 들어있음

 

예제) TurkeyAdapter

더보기
public class TurkeyAdapter implements Duck {
    private Turkey turkey;
    
    TurkeyAdapter(Turkey turkey) { this.turkey = turkey; }

    void quack() { turkey.gobble(); }
    void fly() { turkey.fly(); } 
}

 

3. 예시: EnumerationIterator

Enumeration

  • 자바의 예전 컬렉션 순회 방식 (HashTable, Stack, Vector)

 

Iterator

  • 현재 컬렉션 프레임워크에서 사용하는 순회 인터페이스

 

EnumerationIterator (Adapter)

  • org.apache.commons.collections.iterators
  • 구형 코드로 새로운 인터페이스를 사용하기 위해 어댑터 패턴을 사용

 

코드

더보기
public class EnumerationIterator implements Iterator<Object> {
    Enumeration<?> enumeration;
    
    public EnumerationIterator(Enumeration<?> enumeration) {
    	this.enumeration = enumeration;
    }
    
    public boolean hasNext() { return enumeration.hasMoreElements(); }
    public Object next() { return enumeration.nextElement(); }
    public void remove() { throw new UnsupportedOperationException(); }
}