装饰者模式概念
动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案
装饰者模式结构图
装饰者角色
1.被装饰者基类(Compoent):对象组件
2.待装饰对象(ConcreteComponent):具体组件角色,即将要被装饰增加功能的类
3.装饰者基类(Decorator):需要定义一个与组件接口一致的接口,并持有一个Component对象,该对象其实就是被装饰的对象。
4.具体装饰者(ConcreteDecorator):现具体要向被装饰对象添加的功能。用来装饰具体的组件对象或者另外一个具体的装饰器对象
实例代码
<?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();
}
}
//具体装饰者类
class ConcreteComponent implements Component{
public function operation(){
return 'do operation';
}
}
//具体装饰者a
class ConcreteDecoratorA extends Decorator{
public function __construct(Component $component)
{
parent::__construct($component);
}
public function operation()
{
parent::operation();
$this->addOperationA();
}
public function addOperationA(){
return 'add operation a';
}
}
//具体装饰者类b
class ConcreteDecoratorB extends Decorator{
public function __construct(Component $component)
{
parent::__construct($component);
}
public function operation()
{
parent::operation();
$this->addOperationB();
}
public function addOperationB(){
echo 'add operation b';
}
}
$decoratorA = new ConcreteDecoratorA(new ConcreteComponent());
$decoratorA->operation();
总结
1.装饰者和被装饰者对象有相同的超类型
2.你可以用一个或者多个装饰者包装一个对象
3.既然装饰者和被装饰者对象有相同的超类,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象替换他
4.(关键点)装饰者可以在委托被装饰者的行为之前/之后,加上自己的行为,已达到特地的目的
5.对象可以在任何时候被装饰,所以可以在运行时动态的、不限量的用你喜欢的装饰者来装饰对象
参考文献《head first 设计模式》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。