z 장식자(Decorator) :: C++, 그래픽 기술 블로그

1. 용도

객체에 동적으로 새로운 책임을 추가할 수 있게 합니다. 기능을 추가하려면, 서브클래스를 생성하는 것보다 융통성 있는 방법을 제공합니다.


2.  활용성

  • 다른 객체에 영향을 주지 않고 개개의 객체에 새로운 책임을 추가하고 싶을 때
  • 제거될 수 있는 책임에 대해 사용
  • 실제 상속으로 서브클래스를 계속 만드는 방법이 실질적이지 못할 때 사용

3. Class Diagram과 구조

[Component] - 동적으로 추가할 서비스를 가질 가능성이 있는 객체들에 대한 인터페이스

[ConcreteComponent] - 추가적인 서비스가 실제로 정의되어야 할 필요가 있는 객체

[Decorator] - Component 객체에 대한 참조자를 관리하면서 Component에 정의된 인터페이스를 만족하도록 인터페이스를 정의

[ConcreteDecorator] - Component에 새롭게 추가할 서비스를 실제로 구현하는 클래스

 

Decorator는 자신의 Component 객체 쪽으로 요청을 전달합니다. 요청 전달 전 및 전달 후에 자신만의 추가 연산을 선택적으로 수행할 수도 있습니다.


4. 장단점

장점

  • 단순 상속보다 설계의 융통성 증대- 객체에 새로운 행동을 추가할 수 있는 가장 효과적인 방법으로, 장식자를 객체와 연결하거나 분리하는 작업을 통해 새로운 책임을 추가하거나 삭제하는 일이 런타임에 가능해집니다.
  • 클래스 계통의 상부측 클래스에 많은 기능 누적 회피 가능
  • 장식자와 구성요소 동일 X - 장시자는 사용자에게 일관된 인터페이스를 제공하는 껍데기로, 구성 요소와 장식자 객체가 동일한 식별자를 가질 필요가 없습니다.

단점

  • 작은 규모의 객체 다수 생성 - 객체가 많아지므로, 상호작용 방법 등 시스템의 재정의가 어려워 질 수 있습니다.

5. 구현 방법

  1. 인터페이스 일치 시키기 - Decorator 객체의 인터페이스가 자신을 둘러싼 구성요소의 인터페이스와 동일해야 합니다.
  2. 추상 클래스로 정의되는 Decorator 클래스 생략 - Decorator 클래스에 정의할 책임이 한 가지만 존재한다면 정의할 필요가 없습니다.
  3. Component 클래스는 가벼운 무게 유지 - 연산에 해당하는 인터페이스만을 정의하고 저장할 변수는 정의하지 않아 Decorator가 Component를 상속받을 때 복잡하고 무거운 클래스가 되지 않도록 합니다.
  4. 겉과 속 중 변경할 곳 지정 - 객체의 외장을 변경하지만, 내부도 변경할 수도 있고 이는 보통 전략 패턴으로 이어집니다.

'C++공부 > GoF의 디자인 패턴' 카테고리의 다른 글

플라이급(Flyweight)  (0) 2022.07.06
퍼사드(Facade)  (0) 2022.07.06
복합체(Composition)  (0) 2022.07.06
가교(Bridge)  (0) 2022.07.06
적응자(Adapter)  (0) 2022.07.06

+ Recent posts