我们都知道,得到一匹布需要大概这么几步:
       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. MapReduce 程序:WordCount

  3. 接口、索引器、Foreach的本质(学习笔记)

    接口 什么是接口? 接口代表一种能力,和抽象类类似但比抽象类的抽象程度更高! 接口的定义: public interface IEat//定义一个接口 { void Eat(string food); ...

  4. SQL使用技巧-批量删除-批量更新-bcp导出-跨服务器sql

    1.循环删除数据   while @@rowcount>0 begin      delete top (1000)  from  T   where OperateTime >=2014 ...

  5. STM8S103 STVD编译空间不足

    关于text空间(理解为代码空间)不足问题 # 关于.bsct和.ubsct问题(着重参考http://www.waveshare.net/article/STM8-3-1-10.htm) map文件 ...

  6. RocketMQ学习笔记(8)----RocketMQ的Producer API简介

    在RocketMQ中提供了三种发送消息的模式: 1.NormalProducer(普通) 2.OrderProducer(顺序) 3.TransactionProducer(事务) 下面来介绍一下pr ...

  7. 在javascript中对于this指向的再次理解

    总所周知,function () {}函数体内的this对象指向的是调用该函数的对象,那么我们看一下这个例子 <script> var length = 3; function fn () ...

  8. 使用了未经检查或不安全的操作。有关详细信息, 请使用 -Xlint:unchecked 重新编译。

    警告信息如下:

  9. iOS开发——循环遍历的比较

    常用的有for in.for循环.EnumerateObjectsUsingBlock 1.小规模的数据无所谓,但是对大量数据,for in 的遍历速度非常之快,不是for循环能比的: 2.对于数组, ...

  10. 使用vue实现简单键盘,支持移动端和pc端

    常看到各种app应用中使用自定义的键盘,本例子中使用vue2实现个简单的键盘,支持在移动端和PC端使用,欢迎点赞,h5 ios输入框与键盘 兼容性优化 实现效果: Keyboard.vue <t ...