装饰器模式

  内容来自《深入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
?>

  

  

posted @   寻觅beyond  阅读(255)  评论(0编辑  收藏  举报
编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
历史上的今天:
2017-04-09 手把手教你在新浪云上免费部署自己的网站---基础
返回顶部
点击右上角即可分享
微信分享提示