我们都知道,得到一匹布需要大概这么几步:
       1、染色
       2、印花
       3、裁剪
  这种形式在面向对象中怎么实现呢?

面向过程【继承模式】实现:

    继承模式得到需要的布料,一步一步的加工。
    继承的层次越来越深,扩展性差。如果中间加道其他程序,就有些吃力了。
<?php
    header("content-type:text/html;charset=utf8");
    class BaseCloth{         //布料初始的样子
        protected $content;
        public function __construct($con){
            $this->content=$con;
        }
        public function cloth(){
            return $this->content;
        }
    }
    class DyeingCloth extends BaseCloth{   //染色
        public function dyeing(){
            return $this->content."  --->染上色";
        }
    }
    class StampCloth extends DyeingCloth{   //印花
        public function stamp(){
            return $this->content."  --->印上好看的花";
        }
    }
    class CutCloth extends StampCloth{      //裁剪
        public function cut(){
            return $this->content."  --->根据需求裁剪";
        }
    }

    //布料加工。
    $cloth= new BaseCloth("白布");
    $dyeing=new DyeingCloth($cloth->cloth());
    $stamp=new StampCloth($dyeing->dyeing());
    $cut=new CutCloth($stamp->stamp());
    echo $cut->cut();
?>

装饰器模式实现布匹加工。

<?php
    header("content-type:text/html;charset=utf8");
    /**
     * 装饰器模式完成布料的加工。动态、扩展性好。
     */
    class BaseCloth{         //布料的初始样子
        protected $content;
        public function __construct($con){
            $this->content=$con;
        }
        public function cloth(){
            return $this->content;
        }
    }
    class DyeingCloth extends BaseCloth{   //染色
        public function __construct(BaseCloth $cloth){
            $this->cloth=$cloth;
            $this->cloth();
        }
        public function cloth(){
            return $this->cloth->cloth()."  --->染上色";
        }
    }
    class StampCloth extends BaseCloth{   //印花
        public function __construct(BaseCloth $cloth){
            $this->cloth=$cloth;
            $this->cloth();
        }
        public function cloth(){
            return $this->cloth->cloth()."  --->印上花";
        }
    }
    class CutCloth extends BaseCloth{      //裁剪
        public function __construct(BaseCloth $cloth){
            $this->cloth=$cloth;
            $this->cloth();
        }
        public function cloth(){
            return $this->cloth->cloth()."  --->根据需求裁剪";
        }
    }

    //布料加工。
    $con=new CutCloth(new DyeingCloth(new BaseCloth("白布")));
    echo $con->cloth();
?>

php八大设计模式之装饰器模式的更多相关文章

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

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

  2. PHP设计模式之装饰器模式(Decorator)

    PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...

  3. python设计模式之装饰器模式

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

  4. PHP设计模式之装饰器模式

    装饰器模式:如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的功能,则应该使用装饰器模式.简单点说:就是我们不应该去修改已有的类,而是通过创建另外一 ...

  5. java设计模式之 装饰器模式

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

  6. php设计模式八-----装饰器模式

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

  7. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

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

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

  9. 设计模式之装饰器模式(PHP实现)

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

随机推荐

  1. Ext4,Ext3的特点和区别

    Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4. Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只 ...

  2. xBIM 高级03 更改日志创建

    系列目录    [已更新最新开发文章,点击查看详细]  模型中发生的每一个变化都是事务的一部分,这是我们设计的核心.所有事务都是由 IModel 的实现创建的,并且从中被弱引用,因此当使用 using ...

  3. 3ds Max实例教程-制作卡通蓝色小人

    此篇教程分享使用3ds Max制作卡通蓝色小人,是根据作者梦境出现的画面为原型,加以改造,得到的最终效果图. 创作一张图最重要的地方是先用纸和笔画出草稿图.你需要表明所有的细节,研究角色的特点——我发 ...

  4. 利用SignalR来同步更新Winfrom

    之前写了个用Socket来更新多个Winfrom的试例,这两天看了下SignalR,也用这个来试一下 SignalR 地址:https://www.asp.net/signalr 我这个也是基于 ht ...

  5. (转)String StringBuilder StringBuffer 对比 总结得非常好

    来源:http://blog.csdn.net/clam_clam/article/details/6831345 转自:http://www.iteye.com/topic/522167 作者:每次 ...

  6. ajax 不执行

    1.get形式访问: 一个相同的URL 只有一个结果,所以 第二次访问的时候 如果 URL字符串没变化 浏览器是 直接拿出了第一次访问的结果,post则不会 解决办法: 1.url+new Date( ...

  7. linux 调试相关命令

    1. tail -f filename 调试时,log输出到文件,但是又想看到即时输出信息 未完待续....

  8. 紫书 例题 10-2 UVa 12169 (暴力枚举)

    就是暴力枚举a, b然后和题目给的数据比较就ok了. 刘汝佳这道题的讲解有点迷,书上讲有x1和a可以算出x2, 但是很明显x2 = (a * x1 +b) 没有b怎么算x2?然后我就思考了很久,最后去 ...

  9. centos7.3安装php7.0

    需求:在Centos7.3下搭建LNMP环境 文章转载自:http://blog.csdn.net/wszll_alex/article/details/76285324 作者:狂热森林 . 关闭防火 ...

  10. Java基础学习总结(8)——super关键字

    一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引 ...