책너두 (헤드 퍼스트 디자인 패턴) 21일차 (~293p)
- Book/헤드 퍼스트 디자인 패턴
- 2023. 7. 21.
요약
- 어댑터 패턴과 퍼사드 패턴
- 실전 적용! 어댑터 패턴
- Enumeration을 Iterator에 적응시키기
- 어댑터 디자인하기
- 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 클래스 참고
- 스트리밍 플레이어, 프로젝터, 자동 스크린, 서라운드 음향, 팝곤 기계까지 갖춘 시스템을 구성함.
복잡한 방법으로 영화 보기
- 팝콘 기계를 켠다
- 팝콘을 튀기기 시작한다.
- 조명을 어둡게 조절한다.
- 스크린을 내린다.
- 프로젝터를 켠다.
- 프로젝터 입력을 스트리밍 플레이어로 설정한다.
- 프로젝터를 와이드 스크린 모드로 전환한다.
- 앰프를 켠다.
- 앰프 입력을 스트리밍 플레이어로 설정한다.
- 앰프를 서라운드 음향 모드로 전환한다.
- 앰프 볼륨을 중간(5)으로 설정한다.
- 스트리밍 플레이어를 켠다.
- 영화를 재생한다.
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개나 필요함.
- 만약, 영화가 끝나면, 어떻게 꺼야 하는가?
- 방금 했던 일을 전부 역순으로 처리해야 함.
- 영화말고 라디오를 들어도 이렇게 복잡한가?
- 시스템 업그레이드를 하면 작동 방법을 또 배워야 함..
- 이런 복잡한 일을 퍼사드 패턴으로 간단하게 처리 가능함.
'Book > 헤드 퍼스트 디자인 패턴' 카테고리의 다른 글
책너두 (헤드 퍼스트 디자인 패턴) 23일차 (~316p) (0) | 2023.07.30 |
---|---|
책너두 (헤드 퍼스트 디자인 패턴) 22일차 (~304p) (0) | 2023.07.22 |
책너두 (헤드 퍼스트 디자인 패턴) 20일차 (~283p) (0) | 2023.07.20 |
책너두 (헤드 퍼스트 디자인 패턴) 19일차 (~271p) (0) | 2023.07.19 |
책너두 (헤드 퍼스트 디자인 패턴) 18일차 (~256p) (0) | 2023.07.18 |