一:什么是装饰器模式?
- 动态地给一个对象附加额外的职责。装饰者为功能的扩展提供了一个比使用子类继承更加灵活的选择
- 简单来说,就是我们可以动态的对一个对象,进行一些增加/删除功能,让其可以灵活的实现需求。
二:为什么要用装饰器模式?
- 还是拿昨天的商场打折的事,接着举例子。2018/10/26《大话设计模式》【策略模式】
- 在商场打折中,我们已经定义好了一些策略,但是天有不测风云,如果我并不想让这些策略单独的运行。
- 也就是说,我希望如果用户满1K之后,先打八折,在减100,这种不断添加的新算法上,我们昨天的就不适用了。
- 这时,也就用到了装饰器模式,在此模式中,商品价格就是一个待装饰的对象,需要我们装饰合适的需求上去。
三:装饰器模式的优缺点?
- 优点
- 可以动态的扩展关系。
- 修饰器和被装饰者解耦,互相不关联
- 缺点
- 内部继承关系比较复杂
四:装饰器模式结构图?
-
五:实现装饰器模式?
<?php // Decorator 装饰器模式 /* * 计算金额装饰器 * Interface Decorator */ interface Decorator { public function Compute(); } /** * 待装饰初始金额 * Class ConcreteDecorator */ class CreateDecorator implements Decorator { public $money; public function __construct($money) { $this->money = $money; } public function Compute() { } } /** * 不同计算金额方式 - 装饰器父类 * Class Clothes */ class Money implements Decorator { protected $decorator; function Decorate($decorator) { $this->decorator = $decorator; } function Compute() { if(!empty($this->decorator)) { $this->decorator->Compute(); } } } //------------------------------具体装饰器---------------- // 打八折装饰器 class A extends Money { function Compute() { $this->decorator->money *= 0.8; } } // 满500 - 100 装饰器 class B extends Money { function Compute() { if ($this->decorator->money > 500) { $this->decorator->money -= 100; } } } //------------------------装饰器模式测试代码------------------ // 计算初始金额 $Money = new CreateDecorator(1000); // 先满减 $A = new A(); // 在打八折 $B = new B(); // 打折装饰器 $A->Decorate($Money); $A->Compute(); // 满减装饰器 $B->Decorate($Money); $B->Compute(); var_dump($Money);
github: https://github.com/papapalh/Php-Practice/blob/master/Design%20pattern/2_Decorator.php