책너두 (헤드 퍼스트 디자인 패턴) 21일차 (~293p)

요약

  • 어댑터 패턴과 퍼사드 패턴
    • 실전 적용! 어댑터 패턴
      • Enumeration을 Iterator에 적응시키기
        • 어댑터 디자인하기
    • 퍼사드 패턴 맛보기
      • 홈시어터 만들기
      • 복잡한 방법으로 영화 보기

메모

실전 적용! 어댑터 패턴

  • 자바 초기 컬렉션 형식(Vector, Stack, Hashtable)에서 Enumeartion을 구현했기에, 컬렉션의 요소를 리턴하는 elements() 메소드가 구현되어 있음.
    • Enumeration 인터페이스를 사용하면 컬렉션의 각 항목이 어떻게 관리되는지 신경 쓸 필요 없이 모든 항목에 접근 가능함.
  • Enumeration과 마찬가지로 Iterator 는 컬렉션에 있는 일련의 항목에 접근하고, 그 항목을 제거할 수 있게 해주는 인터페이스임.
  • Enumeartion 인터페이스는 구형 코드임.
    • 새로운 코드를 만들 때는 Iterator만 사용하는게 좋음. 이때 어댑터 패턴을 적용하면 좋음.

Enumeration을 Iterator에 적응시키기

  • Iterator : 타깃 인터페이스
  • Enumeration : 어댑티 인터페이스
  • 두 메소드는 동일한 역할을 하는 메소드가 있어 비교적 간단함.
    • 하지만 Iterator 는 remove 메소드를 가지고 있는데, Enumeartion에는 이런 기능을 제공하는 메소드가 없음.

어댑터 디자인하기

  • EnumerationIterator 가 어댑터임.
    • Iterator 인터페이스를 구현함. → 새로운 코드는 Iterator만 사용함.
  • Enumeration 인터페이스를 구현하는 클래스는 어댑티가 됨.
  • Enumeration 인터페이스는 remove 기능을 제공하지 않음.
    • 따라서, 어댑터 차원에서 완벽하게 작동하는 remove() 메소드 구현 방법이 없음.
    • 가장 좋은 방법은 런타임 예외를 던지는 것임.
  • 메소드가 일대일로 대응되지 않는 상황에서는 어댑터를 완벽하게 적용할 수 없음.
public class Enumeration Iterator 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();
    }
}

퍼사드 패턴 맛보기

  • 인터이스를 변경하는 패턴임.
    • 하나 이상의 클래스 인터페이스를 깔끔하면서도 효과적인 퍼사드로 덮어줌.

홈시어터 만들기

  • 홈시어터를 구축한다.
    • 스트리밍 플레이어, 프로젝터, 자동 스크린, 서라운드 음향, 팝곤 기계까지 갖춘 시스템을 구성함.
      • 클래스가 정말 많음.
      • 클래스들은 서로 복잡하게 얽혀 있어서 제대로 사용하려면 꽤 많은 인터페이스를 배우고 쓸 수 있어야 함.
    • p291 클래스 참고

복잡한 방법으로 영화 보기

  1. 팝콘 기계를 켠다
  2. 팝콘을 튀기기 시작한다.
  3. 조명을 어둡게 조절한다.
  4. 스크린을 내린다.
  5. 프로젝터를 켠다.
  6. 프로젝터 입력을 스트리밍 플레이어로 설정한다.
  7. 프로젝터를 와이드 스크린 모드로 전환한다.
  8. 앰프를 켠다.
  9. 앰프 입력을 스트리밍 플레이어로 설정한다.
  10. 앰프를 서라운드 음향 모드로 전환한다.
  11. 앰프 볼륨을 중간(5)으로 설정한다.
  12. 스트리밍 플레이어를 켠다.
  13. 영화를 재생한다.
popper.on();
popper.pop();

lights.dim(10);

screen.down();

projector.on();
projector.setInput(player);
projector.wideScreenMode();

amp.on();
amp.setDvd(player);
amp.setSurroundSound();
amp.setVolume(5);

player.on();
player.play(movie);
  • 클래스가 6개나 필요함.
  • 만약, 영화가 끝나면, 어떻게 꺼야 하는가?
    • 방금 했던 일을 전부 역순으로 처리해야 함.
  • 영화말고 라디오를 들어도 이렇게 복잡한가?
  • 시스템 업그레이드를 하면 작동 방법을 또 배워야 함..
  • 이런 복잡한 일을 퍼사드 패턴으로 간단하게 처리 가능함.

댓글

Designed by JB FACTORY