以下文字部分均为本人自己的想法与总结所以未必正确;
代码摘自https://blog.csdn.net/rust94/article/details/88895465
装饰模式:
概念: 装饰模式(又称包装模式)就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。
角色:
抽象产品类
具体产品类
抽象装饰类
具体装饰类
个人理解:
打个比方说,如果是继承的话就是就是大箱子(父类)里面套个小箱子(子类),而装饰模式则不是继承而是‘组合’,是给原来的大箱子外面加个装饰。
装饰模式能动态的给一个产品添加一些额外的“装饰”(也就是新的功能),就增加功能来说,装饰模式比生成子类更为灵活。 在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是用装饰来包裹真实的对象来实现。
<?php
abstract class Component
{
abstract public function Operation();
}
/**
* ConcreteComponent
*/
class ConcreteComponent extends Component
{
public function Operation()
{
echo "具体对象的操作.\n";
}
}
abstract class Decorator extends Component
{
protected $component;
// 设置component
public function SetComponent($component)
{
$this->component = $component;
}
// 重写Operation(),实际执行的是component的Operation方法
public function Operation()
{
if ($this->component != null)
{
$this->component->Operation();
}
}
}
/**
* ConcreteDecoratorA
*/
class ConcreteDecoratorA extends Decorator
{
// 本类的独有功能,以区别于ConcreteDecoratorB
private $addedState;
public function Operation()
{
// 首先运行原Component的Operation(),再执行本类的功能,
// 如addedState,相当于对原Component进行了装饰
parent::Operation();
$this->addedState = "ConcreteDecoratorA Status";
echo $this->addedState."\n";
echo "具体装饰对象A的操作.\n";
}
}
/**
* ConcreteDecoratorB
*/
class ConcreteDecoratorB extends Decorator
{
public function Operation()
{
// 首先运行原Component的Operation(),再执行本类的功能,
// 如addedBehavior,相当于对原Component进行了装饰
parent::Operation();
$this->addedBehavior();
echo "具体装饰对象B的操作.\n";
}
// 本类的独有功能,以区别于ConcreteDecoratorA
private function addedBehavior()
{
echo "ConcreteDecoratorB Status.\n";
}
}
// 客户端代码
// 装饰的方法是:首先用ConcreteComponent实例化对象c,
// 然后用ConcreteDecoratorA的实例对象$di来包装$c,
// 然后再用ConcreteDecoratorB的实例$d2包装$d1,
// 最终执行$d2的Operation();
$c = new ConcreteComponent();
$d1 = new ConcreteDecoratorA();
$d2 = new ConcreteDecoratorB();
$d1->SetComponent($c);
$d2->SetComponent($d1);
$d2->Operation();