装饰器模式
内容来自《深入PHP面向对象、模式与实践》
装饰器模式其实和他的名称是一个意思,就是起“装饰的作用”。
要想起到装饰作用,首先必须有一个原型,这个原型就是要被装饰的对象,这个原型包含一些自身的属性。执行装饰动作的是另外一个对象,目的就是修改原型中的某些属性,让他看起来和以前不一样,因为做了装饰了嘛,但是,原型本身还是没有变,只是装饰之后的返回的样子变了。所以思路就是:一个将原型传递给装饰者,装饰者对原型进行装饰,然后返回经过装饰后的对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?php abstract class Tile{ abstract function getWealthFactor(); } //这就是原型对象,被装饰的对象 class Plains extends Tile{ //原型中有一个wealthfactor属性,其他装饰器都是装饰这个属性 private $wealthfactor = 2; function getWealthFactor(){ return $this ->wealthfactor; } } //声明一个装饰者抽象接口 abstract class TileDecorator extends Tile{ protected $tile ; function __construct( Tile $tile ){ $this ->tile = $tile ; } } //声明一个用钻石进行装饰的装饰者 class DiamondDecorator extends TileDecorator { function getWealthFactor(){ return $this ->tile->getWealthFactor() + 2; } } //声明一个有污染的装饰者 class PollutionDecorator extends TileDecorator{ function getWealthFactor(){ return $this ->tile->getWealthFactor() - 4; } } $plains = new Plains(); echo $plains ->getWealthFactor(). "\n" ; //输出2 //将一个原型对象传给一个钻石装饰者,让其进行装饰 $tile = new DiamondDecorator( new Plains() ); echo $tile ->getWealthFactor(). "\n" ; //输出4 //进行多次的装饰 $tile = new PollutionDecorator( new DiamondDecorator( new Plains() ) ); echo $tile ->getWealthFactor(). "\n" ; //输出0 ?> |
如需转载,请注明文章出处,谢谢!!!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
2017-04-09 手把手教你在新浪云上免费部署自己的网站---基础