PHP设计模式之装饰者模式代码实例
定义:
装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能。传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多。
角色:
Component(被装饰对象基类)
ConcreteComponent(具体被装饰对象)
Decorator(装饰者基类)
ContreteDecorator(具体的装饰者类)
示例代码:
//被装饰者基类
interfaceComponent
{
publicfunctionoperation();
}
//装饰者基类
abstractclassDecoratorimplementsComponent
{
protected$component;
publicfunction__construct(Component$component)
{
$this->component=$component;
}
publicfunctionoperation()
{
$this->component->operation();
}
}
//具体装饰者类
classConcreteComponentimplementsComponent
{
publicfunctionoperation()
{
echo'dooperation'.PHP_EOL;
}
}
//具体装饰类A
classConcreteDecoratorAextendsDecorator{
publicfunction__construct(Component$component){
parent::__construct($component);
}
publicfunctionoperation(){
parent::operation();
$this->addedOperationA();//新增加的操作
}
publicfunctionaddedOperationA(){
echo'AddOperationA'.PHP_EOL;
}
}
//具体装饰类B
classConcreteDecoratorBextendsDecorator{
publicfunction__construct(Component$component){
parent::__construct($component);
}
publicfunctionoperation(){
parent::operation();
$this->addedOperationB();
}
publicfunctionaddedOperationB(){
echo'AddOperationB'.PHP_EOL;
}
}
classClient{
publicstaticfunctionmain(){
/*
dooperation
AddOperationA
*/
$decoratorA=newConcreteDecoratorA(newConcreteComponent());
$decoratorA->operation();
/*
dooperation
AddOperationA
AddOperationB
*/
$decoratorB=newConcreteDecoratorB($decoratorA);
$decoratorB->operation();
}
}
Client::main();