装饰者模式

装饰者模式可以动态的给一个对象添加一些额外的职责,非常灵活进行组合。

装饰者模式也可以解决继承依赖的难题,比如在一个项目中,反复使用继承会造成层级结构太大,有很多父类的属性和方法根本用不上,后期需求改动,想修改也难于上青天。这时候可以使用装饰者模式。

不过装饰者模式会造成过多子类的问题。

下面用玩具价格为例,从出厂价到代理价,再到商场售价。

<?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());


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值