Java/Java 객체지향 디자인 패턴

[Java 객체 지향 디자인 패턴] 10. 데커레이터 패턴 - 여러 기능의 조합

디벨로펄 2022. 5. 10.
반응형

상속을 통한 기능의 확장은 각 기능별로 클래스를 추가해야 한다는 단점이 있다. 

-> 각 추가 기능 별로 개별적인 클래스를 설계하고 기능을 조합할 때 각 클래스의 객체 조합을 이용하여 기능의 확장을 하도록 한다. 

 

정의

데커레이터 패턴은 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우게 각 추가 기능을 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

 

상당히 똑똑한 패턴인듯 하다. 상속관계가 

반응형

댓글