php面向对象之装饰模式

装饰模式重视代码的组合和委托,轻松的实现合并对象,在 <<php面向对象、模式与实践>>中举了一个非常形象的实例。游戏中不同的区域单元被占领后会得到相应的金钱,当然如果这个地区存在钻石则会增加额外的金币,但是地区被污染的话则会减少金币。


普通的方法是:
//定义基类
abstract class Title {
abstract function getJinbi();
}
//子类实现
class Plains extends Title {
private $jinbi = 2;//增加2个金币
function getJinbi() {
return $this->jinbi;
}
}
//如果存在钻石增加金币
class DiamondPlains extends Plains {
function getJinbi () {
return parent::getJinbi() + 2;
}
}
//如果被污染则减少金币
class PulltedPlains extends Plains {
function getJinbi () {
return parent::getJinbi() - 4;
}
}




显然这段代码不够灵活,原因是我们可以单独获取占领后得到的金币,也可以单独获取有钻石和被污染的金币,但是我们呀想得到
被占领后总的金币却不行,要单独写一个运算的class计算。这时候可以使用装饰模式。进行对象的组合




//定义基类
abstract class Title {
abstract function getJinbi();
}
//子类实现
class Plains extends Title {
private $jinbi = 2;//增加2个金币
function getJinbi() {
return $this->jinbi;
}
}
//声明一个 TitleDecrator重新定义 DiamondPlains 和 PulltedPlains


abstract class TitleDecrator {
protected $title;//定义一个Title属性,目的是给子类继承
function __construct(Title $title) {
$this->title = $title;
}
}


//如果存在钻石增加金币
class DiamondPlains extends TitleDecrator {
function getJinbi () {
return $this->title->getJinbi() + 2;
}
}
//如果被污染则减少金币
class PulltedPlains extends TitleDecrator {
function getJinbi () {
return $this->title->getJinbi()getJinbi() - 4;
}
}


这样我们可以计算单独计算占领后、有钻石和被污染的金币,重要的是可以计算总的金币数


$obj = new PulltedPlains( new DiamondPlains( new Plains() ) );
从最里面Plains()计算占领得金币数、往外计算DiamondPlains钻石加成 最后PulltedPlains污染减分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值