装饰器设计模式
什么是装饰器模式
装饰器模式就是对一个已有的结构增加装饰。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
何时使用装饰器
基本说来, 如果想为现有对象增加新功能而不想影响其他对象, 就可以使用装饰器模式.
装饰器类图
装饰器的组成
Component接口:定义一个对象接口,以规范准备接受附加责任的对象。
Decorator接口:装饰器接口
ConcreteComponent :具体组件角色,即将要被装饰增加功能的类
ConcreteDecorator :具体装饰器,向组件添加职责
代码
Component接口
namespace Test;
abstract class Component
{
abstract public function operation();
}
Decorator
namespace Test;
abstract class Decorator extends Component
{
protected $component;
public function __construct(Component $component)
{
$this->component = $component;
}
public function operation()
{
$this->component->operation();
}
abstract public function before();
abstract public function after();
}
ConcreteComponent
namespace Test;
class ConcreteComponent extends Component
{
public function operation()
{
echo "hello world!!!!";
}
}
ConcreteDecoratorA 添加了before和after方法,即在原有操作的基础上之前和之后又添加了职责
namespace Test;
class ConcreteDecoratorA extends Decorator
{
public function __construct(Component $component)
{
parent::__construct($component);
}
public function operation() {
$this->before();
parent::operation();
$this->after();
}
public function before()
{
// TODO: Implement before() method.
echo "before!!!";
}
public function after()
{
// TODO: Implement after() method.
echo "after!!!";
}
}
CLient主要用来实例化装饰器
namespace Test;
class Client
{
/**
*
*/
public static function main() {
$decoratorA = new ConcreteDecoratorA(new ConcreteComponent());
$decoratorA->operation();
$decoratorB=new ConcreteDecoratorA($decoratorA);
$decoratorB->operation();
}
}
调用Clien main()方法结果
before!!!hello world!!!!after!!!before!!!before!!!hello world!!!!after!!!after!!!