我们都知道,得到一匹布需要大概这么几步:
       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. ES API 备忘

    本文所列的所有API在ElasticSearch文档是有详尽的说明,但它的结构组织的不太好. 这篇文章把ElasticSearch API用表格的形式供大家参考. https://www.iteblo ...

  2. hdoj--3592--World Exhibition(差分约束)

    World Exhibition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. 简易的CSS下拉菜单 - 1

    <!DOCTYPE html> <html> <head> <style> body{ margin:0; } .dropmenu{ backgroun ...

  4. 你不知道的JavaScript(七)delete操作符

    JS中的delete操作符不是太常用,容易被忽略,它的作用很简单,用来删除对象的属性或方法. <script type="text/javascript"> var p ...

  5. BAT 解密(四):配置中心、服务中心、异步技术细节

    在系列文章的第二篇文章< BAT解密(二):聊聊业务如何驱动技术发展 >中我们深入分析了互联网业务发展的一个特点:复杂性越来越高.复杂性增加的典型现象就是系统越来越多,当系统的数量增加到一 ...

  6. POJ 2029 Get Many Persimmon Trees 【 二维树状数组 】

    题意:给出一个h*w的矩形,再给出n个坐标,在这n个坐标种树,再给出一个s*t大小的矩形,问在这个s*t的矩形里面最多能够得到多少棵树 二维的树状数组,求最多能够得到的树的时候,因为h,w都不超过50 ...

  7. for 的相关用法

    forEach() <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  8. redis搭建与安装2

    第一步redis安装:1.首先确认下载包为64位的还是32位的2.下载http://code.google.com/p/servicestack/downloads3.解压下载包得到以下文件:cygw ...

  9. SFTP使用key文件登录

    命令: sftp -oPort= -oIdentityFile=/root/.ssh/user.priv user@39.39.100.100 命令选项: -o ssh_option Can be u ...

  10. 入门python:《Python编程快速上手让繁琐工作自动化》中英文PDF+代码

    入门推荐学习<python编程快速上手>前6章是python的基础知识,通俗易懂地讲解基础,初学者容易犯错的地方,都会指出来.从第三章开始,每章都有一个实践项目,用来巩固前面所学的知识. ...