Component: 抽象组件。定义一个对象接口,更多的目的是为了共用类型。
ConcreteComponent:具体组件。定义了一个具体的对象,是被装饰的对象。
Decorator: 抽象装饰类。是装饰抽象类,继承了Component,使所有Decorator子类都统一了类型。它从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator存在的。
ConcreteDecorator:具体装饰类,起到给Component添加职责的功能。
abstract class Component{ abstract public function Operation(); } class ConcreteComponent extends Component{ public function Operation(){ return 'ConcreteComponent is called!'; } } abstract class Decorator extends Component{ protected $component; public function __construct(Component $component){ $this->component = $component; } public function Operation(){ return $this->component->Operation(); } } class ConcreteDecoratorA extends Decorator{ public function Operation(){ return parent::Operation().'with concreteDecoratorA,'; } } class ConcreteDecoratorB extends Decorator{ public function Operation(){ return parent::Operation().'with concreteDecoratorB,'; } } $component = new ConcreteDecoratorB(new ConcreteDecoratorA(new ConcreteComponent())); echo $component->Operation();装饰者模式便于将某个对象的功能进行层层包装,而且这种包装对原始对象是没有任何影响的,而且可以以任何顺序来灵活包装,比如对文字的过滤,可以先过滤html标签再过滤敏感字,也可以反过来,并且可以自由拆装。