GoF定义:动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活。
举例:家庭装修的费用有简装和精装之分,电器的购买需要另外算钱,购买不同的电器以及它们的数量的费用是不一样的,在程序实现上,可以使用装饰器模式。
代码:
<?php
//GoF定义:动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活。
abstract class BaseObj{//定义基础对象
abstract function GetMoney();
}
class BeDecoratedObjA extends BaseObj{//A类装修:简装
private $BasicMenoy=10000;//基础费用
function GetMoney(){
return $this->BasicMenoy;
}
}
class BeDecoratedObjB extends BaseObj{//B类装修:精装
private $BasicMenoy=50000;//基础费用
function GetMoney(){
return $this->BasicMenoy;
}
}
abstract class Decorate extends BaseObj{
private $BeDecoratedObj;
function __construct(BaseObj $B){
$this->BeDecoratedObj=$B;
}
function GetBeDecoratedObj(){
return $this->BeDecoratedObj;
}
abstract function GetMoney();
}
class DecorateA extends Decorate{//购买海信电视机
function GetMoney(){
return parent::GetBeDecoratedObj()->GetMoney()+3500;
}
}
class DecorateB extends Decorate{//购买HUAWEI电视机
function GetMoney(){
return parent::GetBeDecoratedObj()->GetMoney()+5000;
}
}
class DecorateC extends Decorate{//购买格力空调
function GetMoney(){
return parent::GetBeDecoratedObj()->GetMoney()+8000;
}
}
class DecorateD extends Decorate{//购买海尔洗衣机
function GetMoney(){
return parent::GetBeDecoratedObj()->GetMoney()+4000;
}
}
$Obj=new BeDecoratedObjA;//被装饰对象:简装
$AAA=new DecorateA($Obj);//装饰方法:购买海信电视机
echo "总共费用:".$AAA->GetMoney()."<br>";
$BBB=new DecorateB($AAA);//$AAA成了被装饰对象,装饰方法:购买HUAWEI电视机
echo "总共费用:".$BBB->GetMoney()."<br>";
?>
输出:
总共费用:13500
总共费用:18500
上面的GetMoney可以有复杂一些的算法,装饰器模式可以很灵活方便地在被装饰对象上使用不同的算法。