- 상속을 사용한다고 해서 무조건 유연하거나 관리하기 쉬운 디자인이 만들어지진 않는다.
- 구성과 위임으로 실행 중에 행동을 상속하는 방법이 있다.
- 객체를 동적으로 구성하면 기존 코드를 고치는 대신 새로운 코드를 마늗ㄹ어서 기능을 추가할 수 있다.
- 디자인 원칙
- 클래스는 확장에는 열려 있어야 하지만 변경에는 닫혀있어야 한다.
- 모순처럼 보이지만 직접 코드를 수정하지 않고도 코드를 확장할 수 잇게 해주는 기법이 있다.
- 코드에서 확장해야 할 부분을 선택할 때는 세심한 주의를 기울여야 한다.
- 무조건 Open-Closed Psrinciple을 적용한다면 괜히 쓸떼 없는 일을 하며 시간을 낭비할 수 있으며, 필요 이상으로 복잡하고 이해하기 힘든 코드를 만들게 되는 부작용이 발생할 수 있다.
- 객체 장식 EX
- DarkRoast 객체에서 시작한다.
- 고객이 모카를 주문했으니 Mocha 객체를 만들고 그 객체로 DarkRoast를 감싼다.
- 고객이 휘핑크림도 추가했으니까 Whip 데코레어터를 만들어 Mocha를 감싼다.
- 각 객체는 서로의 형식을 반영하며, cost() 메소드를 가지고 있다.
- 정리
- 데코레이터의 슈퍼클래스는 자신이 장식하고 있는 객체의 슈퍼클래스와 같다.
- 한 객체를 여러 개의 데코레이터로 감쌀 수 있다.
- 데코레이터는 자신이 감싸고 있는 객체와 같은 슈퍼클래스를 가지고 있기에 원래 객체가 들어갈 자리에 데코레이터 객체를 넣어도 상관없다.
- 데코레이터는 자신이 장식하고 있는 객체에게 어떤 행동을 위임하는 일 말고도 추가 작업을 수행할 수 있다.
- 객체는 언제든지 감쌀 수 있으므로 실행 중에 필요한 데코레이터를 마음대로 적용할 수 있다.
- 데코레이터 패턴
- 데코레이터 패턴으로 객체에 추가 요소를 동적으로 더할 수 있습니다. 데코레이터를 사용하면 서브 클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있습니다.
- 자잘한 클래스가 엄청나게 추가되는 경우가 종종있어, 이해하기 힘든 디자인이 만들어 질 수도 있다.
- 구성요소를 초기화하는 데 필요한 코드가 복잡해질수도 있다.
- 데코레이터가 적용된 예: JAVA I/O
'Java > DesignPattern' 카테고리의 다른 글
[HeadFirst] 5장 싱글턴 패턴 (0) | 2022.08.24 |
---|---|
[HeadFirst] 4장 팩토리 패턴 (0) | 2022.08.16 |
[헤드퍼스트] 2장 옵저버 패턴 (0) | 2022.08.07 |
[헤드퍼스트] 1장 전략패턴 (0) | 2022.08.02 |