php八大设计模式之装饰器模式
我们都知道,得到一匹布需要大概这么几步:
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八大设计模式之装饰器模式的更多相关文章
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- PHP设计模式之装饰器模式(Decorator)
PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...
- python设计模式之装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- PHP设计模式之装饰器模式
装饰器模式:如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的功能,则应该使用装饰器模式.简单点说:就是我们不应该去修改已有的类,而是通过创建另外一 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- php设计模式八-----装饰器模式
1.介绍: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- Java设计模式系列-装饰器模式
原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...
- c#设计模式之装饰器模式(Decorator Pattern)
引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 pub ...
- 设计模式之装饰器模式(PHP实现)
/** * 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. * 这种模式创建了一个 ...
随机推荐
- poj--3250--Bad Hair Day(模拟)
Bad Hair Day Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit ...
- [JZOJ 5465] [NOIP2017提高A组冲刺11.9] 道路重建 解题报告 (e-dcc+树的直径)
题目链接: http://172.16.0.132/senior/#main/show/5465 题目: 小X所居住的X国共有n个城市,有m条无向道路将其连接.作为一个统一的国家,X 城的任意两个城市 ...
- 一天一个算法:C语言解答杨辉三角
杨辉三角形是形如:11 11 2 11 3 3 11 4 6 4 1的三角形,其实质是二项式(a+b)的n次方展开后各项的系数排成的三角形,它的特点是左右两边全 ...
- C# Lambda && Linq
Lambda表达式在C#3.0加入,它是一个匿名函数,可用于创建委托或者表达式树类型,运算符为=>,读作"goes to",=>左侧是变量,右侧是表达式,变量类型可以自 ...
- Devexpress控件使用一:GridControl
1.控件及列表展示 1).控件 2).构建表格,用于列表展示 3).gridControl绑定数据 4).调用绑定:BindDataSource(InitDt()); 5).展示列表 2.表格的列配置 ...
- 【转载】大型系统中使用JMS优化技巧
[本文转自:http://www.javabloger.com/article/sun-openmq-jms-large-scale-systems.html] 我们先来看看在Sun OpenMQ系统 ...
- Ubuntu 14.04下安装CUDA8.0
配置环境如下: 系统:Ubuntu14.04 64bit 显卡:Nvidia K620M 显卡驱动:Nvidia-Linux-x86_64-375.66.run CUDA8.0 + cudnn8.0 ...
- Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]
------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...
- 【BZOJ4448】【SCOI2015】情报传递
这题面错别字真tm多 题意: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有若T名(可能没有)下线,除1名大头日外其余n-1 ...
- centos7 安装freeswitch
1.安装运行库 yum install -y git gcc-c++ wget alsa-lib-devel autoconf automake bison broadvoice-devel bzip ...