<?php
/**
 * 【装饰器模式 (decorator)】
 * 有时候发布一篇文章需要经过很多人手,层层处理
 */

header("Content-type: text/html; charset=utf-8");

/************************ 《装饰器模式 实现》 ************************/
//文章基础类
class BaseWz{
    protected $content; //定义文章内容属性
    protected $art=null; //定义一个文章对象
    public function __construct($content){
        $this->content = $content;
    }
    public function decorator(){
        return $this->content;
    }

}

//1.小编添加摘要,继承原始的文章类
class XiaobianWz extends BaseWz{
    public function __construct(BaseWz $art){
        $this->art = $art;
    }
    public function decorator(){
        //调用父类的decorator方法,就可以把父类的content返回
        //$res = parent::decorator().'【新增摘要from小编】';
        //$res = $this->art->content.='【新增摘要from小编】';
        $res = $this->content = $this->art->decorator().'【新增摘要from小编】';
        return $res;
    }
}

//2.SEO人员添加优化信息
class SEOWz extends BaseWz{
    public function __construct(BaseWz $art){
        $this->art = $art;
    }
    public function decorator(){
        $res = $this->content = $this->art->decorator().'【新增优化信息from SEOer】';
        return $res;
    }
}

//3.广告部添加广告信息
class ADWz extends BaseWz{
    public function __construct(BaseWz $art){
        $this->art = $art;
    }
    public function decorator(){
        $res = $this->content = $this->art->decorator().'【新增广告信息from ADer】';
        return $res;
    }
}

//4. 后面可以任意添加...

/*开始调用*/
$content = "这就是一篇简单的文章";

$base_wz = new BaseWz($content); //这里传进去的$content是 文章内容
echo $base_wz->decorator();
echo '<br>----------------------------------------<br>';

$xb_wz = new XiaobianWz($base_wz); //这里传进去的 $base_wz 是上面的 “基础文章对象”
echo $xb_wz->decorator();
echo '<br>----------------------------------------<br>';

$seo_wz = new SEOWz($xb_wz); //这里传进去的 $xb_wz 是上面的 “小编文章对象”
echo $seo_wz->decorator();
echo '<br>----------------------------------------<br>';

$ad_wz = new ADWz($seo_wz); //这里传进去的 $seo_wz 是上面的 “SEO文章对象”
echo $ad_wz->decorator();
echo '<br>----------------------------------------<br>';

【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)的更多相关文章

  1. 设计模式学习心得<装饰器模式 Decorator>

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...

  2. 设计模式入门之装饰器模式Decorator

    //装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...

  3. 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...

  4. 装饰器模式-Decorator(Java实现)

    装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...

  5. 装饰器模式 Decorator 结构型 设计模式 (十)

    引子           现实世界的装饰器模式 大家应该都吃过手抓饼,本文装饰器模式以手抓饼为模型展开简介 "老板,来一个手抓饼,  加个培根,  加个鸡蛋,多少钱?" 这句话会不 ...

  6. 23种设计模式之装饰器模式(Decorator Pattern)

    装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...

  7. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  8. 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

    返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...

  9. c#设计模式之装饰器模式(Decorator Pattern)

    引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 pub ...

随机推荐

  1. Power-BI 仪表盘实现动态预警

    BI系统中仪表盘“序列”中的“预警”属性可以手工填入固定的值,也可从数据集里取值设定预警范围 ,以实现动态预警.其中的“范围”属性手工输入固定值应该为百分比(0-1),而在下拉选择绑定列为值是为数值. ...

  2. window操作技巧

    word中符号替换 1. 在网页复制内容时,下箭头用"^l"表示(字母L小写),回车用"^p"表示,可用替换命令全局替换(ctrl+f). 2. 添加底纹菜单在 ...

  3. storm 随机发送字符串

    Storm的程序叫做Topology,类似MapReduce job 一个Topolog应该有Spout,代表数据源,和若干个bolt 首先写一个Spout public class RandomSp ...

  4. Linux-QT 开发环境搭建以及编译镜像

    搭建Linux-QT 开发环境,需要先搭建Android 的编译环境,然后在Android 编译环境的基础上,再搭建Linux-QT 编译环境. 第一:编译器. 第二:设置环境变量.环境变量设置后,编 ...

  5. mysql参数sql_log_bin

    如果想在主库上执行一些操作,但不复制到slave库上,可以通过修改参数sql_log_bin来实现. 比如想在主库上修改某个表的定义,但是在slave库上不做修改: master mysql> ...

  6. sockopt note

    1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO ...

  7. linux:习惯

    1>.系统里面必须最少有两个账号,一个root,一个普通账户; 2>.平时登录系统均使用普通账户登录,除非需要配置或者执行特殊命令才切换至root; 3>.linux系统下严格区分大 ...

  8. PAT 解题报告 1049. Counting Ones (30)

    1049. Counting Ones (30) The task is simple: given any positive integer N, you are supposed to count ...

  9. jQuery uploadify上传文件404,500错误

    1.如果部署到了IIS7的话,IIS7默认的大小为3000000.修改方法如下: 找到网站双击“请求筛选”——右边找到“编辑功能设置”——将“允许的最大内容长度”改成你想要的就行了. 2.当上传大文件 ...

  10. 每天一个liunx命令(ubuntu)

    解压XXX.gz到另一个A文化夹: 1.切换到root权限 su 2.tar -zxvf  XXX.gz -C  A 注意: C要大些因为ubuntu区分大小写