Java/Design Pattern

[헤드퍼스트 디자인 패턴] 7-1. 커맨드 패턴

noahkim_ 2024. 12. 17. 19:05

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

 

1. 어댑터

중개
  • 어떤 인터페이스를 클라이언트에서 요구하는 인터페이스로 바꿔주는 역할

 

2. 오리

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

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

 

 

Adapter

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

    void quack() { turkey.gobble(); }
    void fly() { turkey.fly(); } 
}
  • Composition
    • adaptee 인스턴스가 들어있음

 

3. 예시

Enumeration

  • 컬렉션의 요소들을 순회하기 위한 인터페이스
  • 레거시 클래스들에서 사용되었음 (HashTable, Stack, Vector)

 

Iterator

  • 컬렉션의 항목에 접근하고 그 항목을 제거할 수 있게 해주는 인터페이스

 

EnumerationIterator

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(); }
}
  • org.apache.commons.collections.iterators
  • 구형 코드로 새로운 인터페이스를 사용하기 위해 어댑터 패턴을 사용합니다.