设计模式:装饰器模式

  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可以有复杂一些的算法,装饰器模式可以很灵活方便地在被装饰对象上使用不同的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值