-
概念
装饰器模式又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
-
实例
- 组件对象的接口:可以给这些对象动态的添加职责
- 所有装饰器的父类:需要定义一个与组件接口一直的接口,并持有一个component对象,该对象其实就是被装饰的对象。
- 具体的装饰器类:实现具体要向被装饰对象添加的功能。用来装饰具体的组件对象或者另外一个具体的装饰器对象。
-
使用场景
- 需要动态的给一个对象添加功能,这些功能可以再动态的撤销
- 需要添加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
- 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
<?php //组件对象接口 interface IComponent { //动态给对象添加功能 public function display(); } //待装饰的对象 class Person implements IComponent { protected $name; public function __construct($name) { $this->name = $name; } public function display() { echo '装饰的' . $this->name; } } //所有装饰器的父类 class Clothes implements IComponent { protected $component; public function Decorate(IComponent $component) { $this->component = $component; } public function display() { if (!empty($this->component)) { $this->component->display(); } } } //具体的装饰器 class Pixie extends Clothes { public function display() { echo '皮鞋'; parent::display(); } } class Waitao extends Clothes { public function display() { echo '外套'; parent::display(); } } //客户端 $gd = new Person('狗蛋'); $px = new Pixie(); $px->Decorate($gd); $px->display(); $wt = new Waitao(); $wt->Decorate($gd); $wt->display();