객체에 몇 가지 추가 책임을 동적으로 추가합니다. 기능 추가 측면에서 Decorator 모드는 하위 클래스를 생성하는 것보다 더 유연합니다. [GOF95]
데코레이션 모드는 클라이언트에게 투명한 방식으로 객체에 더 많은 책임을 동적으로 부여합니다. 이는 클라이언트가 장식 전과 장식 후의 물체 사이에 아무런 차이도 느끼지 않는다는 것을 의미합니다. 데코레이션 패턴은 더 많은 하위 클래스를 생성하지 않고도 객체의 기능을 확장할 수 있습니다.
1. 장식 모드 구조도
2. 주인공 꾸미기 모드
추상 구성요소 역할: 추가 책임을 받을 준비가 된 개체를 표준화하여 이러한 개체에 책임을 동적으로 추가할 수 있도록 개체 인터페이스를 정의합니다.
구체적인 구성 요소 역할: 추가 책임을 맡을 클래스를 정의합니다.
데코레이터 역할: 은 Component 객체에 대한 포인터를 보유하고 Component 인터페이스와 일치하는 인터페이스를 정의합니다.
콘크리트 데코레이터 역할: 구성 요소 개체에 추가 책임을 추가하는 역할을 담당합니다.
3. 데코레이션 모드의 장점과 단점
데코레이션 모드의 장점:
1. 정적 상속보다 유연합니다.
2. 계층 구조의 상위 수준에 있는 클래스에 너무 많은 기능을 포함하지 마세요
장식 모드의 단점:
1. 장식 모드를 사용하면 상속 관계를 사용할 때보다 더 많은 객체가 생성됩니다. 그리고 이러한 개체는 모두 상상의 것처럼 보이기 때문에 문제 해결이 어렵습니다.
4. 데코레이션 모드 적용 시나리오
1. 다른 객체에 영향을 주지 않고 동적이고 투명한 방식으로 단일 객체에 책임을 추가합니다.
2. 취소될 수 있는 책임을 처리합니다. 즉, 객체에 기능을 동적으로 추가해야 하며 이러한 기능은 동적으로 취소될 수 있습니다.
3. 서브클래스 생성 방법을 확장할 수 없는 경우. 어떤 경우에는 독립적인 확장이 많이 있을 수 있으며, 각 조합을 지원하기 위해 많은 수의 하위 클래스가 생성되어 하위 클래스 수가 폭발적으로 증가하게 됩니다. 또 다른 경우는 클래스 정의가 숨겨져 있거나 클래스 정의를 사용하여 하위 클래스를 생성할 수 없기 때문일 수 있습니다.
5. 장식 모드 PHP 예제
<?php /** * 抽象构件角色 */ interface Component { /** * 示例方法 */ public function operation(); } /** * 装饰角色 */ abstract class Decorator implements Component{ protected $_component; public function __construct(Component $component) { $this->_component = $component; } public function operation() { $this->_component->operation(); } } /** * 具体装饰类A */ class ConcreteDecoratorA extends Decorator { public function __construct(Component $component) { parent::__construct($component); } public function operation() { parent::operation(); // 调用装饰类的操作 $this->addedOperationA(); // 新增加的操作 } /** * 新增加的操作A,即装饰上的功能 */ public function addedOperationA() { echo 'Add Operation A <br />'; } } /** * 具体装饰类B */ class ConcreteDecoratorB extends Decorator { public function __construct(Component $component) { parent::__construct($component); } public function operation() { parent::operation(); $this->addedOperationB(); } /** * 新增加的操作B,即装饰上的功能 */ public function addedOperationB() { echo 'Add Operation B <br />'; } } /** * 具体构件 */ class ConcreteComponent implements Component{ public function operation() { echo 'Concrete Component operation <br />'; } } /** * 客户端 */ class Client { /** * Main program. */ public static function main() { $component = new ConcreteComponent(); $decoratorA = new ConcreteDecoratorA($component); $decoratorB = new ConcreteDecoratorB($decoratorA); $decoratorA->operation(); $decoratorB->operation(); } } Client::main(); ?>
위는 PHP를 사용하여 장식 모드를 구현하는 코드입니다. 또한 장식 모드에 대한 몇 가지 개념적 차이가 있어 모든 사람의 학습에 도움이 되기를 바랍니다.