装饰者模式可以动态的给一个对象添加一些额外的职责,非常灵活进行组合。
装饰者模式也可以解决继承依赖的难题,比如在一个项目中,反复使用继承会造成层级结构太大,有很多父类的属性和方法根本用不上,后期需求改动,想修改也难于上青天。这时候可以使用装饰者模式。
不过装饰者模式会造成过多子类的问题。
下面用玩具价格为例,从出厂价到代理价,再到商场售价。
<?php
//组件定义行为方法
interface componet{
public function cost();
public function description();
}
//装饰者抽象类利用多态,接收具体组件对象和装饰者对象
abstract class Decorator implements componet{
protected $decorator;
public function __construct(componet $componet) {
$this->decorator = $componet;
}
}
//找代理就抽成
class Agent extends Decorator {
public $money = 5;
//加5元代理费
public function cost() {
return $this->decorator->cost() + $this->money;
}
public function description() {
return $this->decorator->description() . ', 代理费' . $this->money. '¥';
}
}
//商场也要加钱
class Mall extends Decorator {
public $money = 10;
//加10元店铺费
public function cost() {
return $this->decorator->cost() + $this->money;
}
public function description() {
return $this->decorator->description() . ', 店铺费' . $this->money. '¥';
}
}
//具体组件
class Toy implements componet {
public $money = 4;
public function cost() {
return $this->money;
}
public function description() {
return '玩具生产价格为4¥';
}
}
//client
$toyObj = new Toy();
$toyObj = new Agent($toyObj);
$toyObj = new Agent($toyObj);
$toyObj = new Mall($toyObj);
print_r($toyObj->description());
print_r($toyObj->cost());