상속을 통한 기능의 확장은 각 기능별로 클래스를 추가해야 한다는 단점이 있다.
-> 각 추가 기능 별로 개별적인 클래스를 설계하고 기능을 조합할 때 각 클래스의 객체 조합을 이용하여 기능의 확장을 하도록 한다.
정의
데커레이터 패턴은 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우게 각 추가 기능을 Decorator 클래스로 정의한 후 필요한 Decorator 객체를 조합함으로써 추가 기능의 조합을 설계하는 방식이다. 데커레이터 패턴은 기본 기능에 추가할 수 있는 많은 종류의 부가 기능에서 파생되는 다양한 조합을 동적으로 구현할 수 있는 패턴이다.
여기서 핵심은 컴포지션 관계에 있다. 주로 생성자를 통해서 component를 이어 받는데, 이를 통해서 기본 객체에 살을 덧붙여 갈 수 있다.
- Component : 기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의한다. 즉, 클라이언트는 Component를 통해 실제 객체를 사용한다.
- ConcreteComponent : 기본 기능을 구현하는 클래스.
- Decorator : 많은 수가 존재하는 구체적인 Decorator의 공통 기능 제공
- ConcreteDecoratorA, ConcreteDecoratorB : Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능을 뜻한다.
바로 연습문제.
1-1 클래스 기능 설명.
BasicEMailContent : 기본 메일 내용
ExternalEMailContent : 메일 내용을 외부로 보낼때
SecureEMailContent : 기본 메일 내용을 암호화
1-2 클래스 다이어그램 작성.
1-3 실행 결과
Hello
Hello Company Disclaimer
Hello Encrypted
1-4. 클래스 설계의 취약점은 OCP측면에서 설명
새로운 형식의 Mail Content가 추가될 경우에 클래스를 새로 작성해주어야 한다.
1-5. 데커레이터 패턴을 이용해 클래스의 설계 취약점 개선하는 방법 설명.
기본 메일에 보안, 외부 등을 선택적으로 사용할 수 있어야 한다. 외부메일과 보안 메일의 기능을 데커레이터로 정의하면 이를 개선할 수 있다.
1-6. 데커레이터 패턴을 활용해 개선한 클래스 모습을 클래스 다이어그램으로 표현.
1-7. 데커레이터 패턴의 각 구성요소에 대응대는 클래스 명시
- Component : EMailContent
- ConcreteComponenet : BasicEMailContent
- Decorator : EMailDecorator
- ConcreteDecorator : ExternalEMailContent, SecureEMailContent
1-8 코드 작성.
1-9 클라이언트 작성 및 실행 결과
Hello
Hello Company Disclaimer.
Hello Encrypted.
2. 차량 및 옵션.. 코드는 아래 github.
- Component : CarComponent
- ConcreteComponenet : BasicCar
- Decorator : CarOptionDecorator
- ConcreteDecorator : AirBagDecorator, ESCDecorator, NaviDecorator, SCCDecorator
https://github.com/dhdnjswnd/JavaObjectiveDesignPattern/tree/main/src/chapter10
GitHub - dhdnjswnd/JavaObjectiveDesignPattern: 자바 객체지향 디자인패턴 공부자료
자바 객체지향 디자인패턴 공부자료. Contribute to dhdnjswnd/JavaObjectiveDesignPattern development by creating an account on GitHub.
github.com
상당히 똑똑한 패턴인듯 하다. 상속관계가
'Java > Java 객체지향 디자인 패턴' 카테고리의 다른 글
[Java 객체 지향 디자인 패턴] 9. 옵서버 패턴 - 통보의 캡슐화 (0) | 2022.05.09 |
---|---|
[Java 객체 지향 디자인 패턴] 8. 커맨드 패턴 - Command Pattern : 기능의 캡슐화 (0) | 2022.03.17 |
[Java 객체 지향 디자인 패턴] 7. 스테이트 패턴 - State Pattern : 상태의 캡슐화 (0) | 2022.03.14 |
[Java 객체 지향 디자인 패턴] 6. 싱글턴 패턴 - Singleton Pattern : 단하나! 비동기 시 주의 (0) | 2022.02.23 |
[Java 객체 지향 디자인 패턴] 5. 스트래티지 패턴 - Strategy Pattern~! 전략 패턴~! (0) | 2022.02.23 |
댓글