设计模式-装饰模式
装饰模式 Decorator Pattern: (结构型模式)
动态的给一个对象增加一些额外的职责。
在不改变原类和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,
也就是装饰包裹真实的对象。所以人们有啥也称它为包装器 Wrapper, 与适配器模式别名相同,
它们使用的场合不同。
我们常用的给一个类增加行为方法:
1、继承机制,使用继承机制给类增加功能
2、关联机制:即是将一个类的对象嵌入到另外一个对象中,然后用这个对象调用它自己的一些行文。
那为啥子还有装饰器模式呢?
因为装饰器模式比继承生成子类更加灵活,可以动态的增加功能,也可以动态撤销功能。
装饰模式包含如下角色:
Component: 抽象组件:定义一个对象接口,以规范准备接受附加责任的对象,即可给这些对象动态添加职责
ConcreteComponent 具体组件角色:被装饰者,定义一个将要被装饰增加功能的类。可以给这个类的对象添加一些职责。
Decorator 抽象装饰类: 维持一个指向组件对象的实例,并定义一个与抽象组件角色接口一致的几口
ConcreteDecorator 具体装饰类: 向组件添加角色。
示例:
<?php //https://blog.csdn.net/jhq0113/article/details/45458133 //对象接口 interface IComponent { function Display(); } //待装饰对象 class Person implements IComponent { private $name; function __construct($name) { $this->name = $name; } function Display() { echo "装扮: ".$this->name." \r\n"; } } //装饰器父类 class Clothes implements IComponent { protected $component; function Decorate(IComponent $component) { $this->component = $component; } function Display() { if (!empty($this->component)) { $this->component->Display(); } } } //具体装饰器 class PiXie extends Clothes { function Display() { echo "皮鞋 "; parent::Display(); } } class QiuXie extends Clothes { function Display() { echo "球鞋 "; parent::Display(); } } class Tshirt extends Clothes { function Display() { echo "Txue "; parent::Display(); } } class WaiTao extends Clothes { function Display() { echo "外套 "; parent::Display(); } } $YaoMing = new Person("姚明"); $pixie = new PiXie(); $WaiTao = new WaiTao(); $pixie->Decorate($YaoMing); $WaiTao->Decorate($pixie); $WaiTao->Display();
== just do it ==