PHP设计模式之装饰模式

<?PHP
//装饰模式定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
//装饰模式的特点:
// (1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
// (2) 装饰对象包含一个真实对象的引用(reference)
// (3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
// (4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
//适用性:
// 以下情况使用Decorator模式
// 1. 需要扩展一个类的功能,或给一个类添加附加职责。
// 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
// 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
// 4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
// 优点:
// 1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
// 2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
// 缺点:
// 1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
// 2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
// 3. 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。
// 设计原则:
// 1. 多用组合,少用继承。
// 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。
// 2. 类应设计的对扩展开放,对修改关闭。
// 装饰者与适配者模式的区别编辑
// 1.关于新职责:适配器也可以在转换时增加新的职责,但主要目的不在此。装饰者模式主要是给被装饰者增加新职责的。
// 2.关于原接口:适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完成使用。(增加新接口的装饰者模式可以认为是其变种--“半透明”装饰者)
// 3.关于其包裹的对象:适配器是知道被适配者的详细情况的(就是那个类或那个接口)。装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道。[1] 

/**
 * 装扮抽象类 装扮子类继承实现打扮方法
 */
abstract class Decorate{
	//定义被装扮人对象引用
	protected $presonObj;
	public function __construct($presonObj){
		$this->presonObj = $presonObj;
	}
	//强制子类实现打扮方法
	abstract public function dress();
}
/**
 * 装扮类1
 */
class Decorate1 extends Decorate{
	public function dress(){
		echo "我是装扮方法1".PHP_EOL;
		$this->presonObj->dress();
	}
}

/**
 * 装扮类2
 */
class Decorate2 extends Decorate{
	public function dress(){
		echo "我是装扮方法2".PHP_EOL;
		$this->presonObj->dress();
	}
}

/**
 * 装扮类3
 */
class Decorate3 extends Decorate{
	public function dress(){
		echo "我是装扮方法3".PHP_EOL;
		$this->presonObj->dress();
	}
}
/**
 * 被装扮类
 */
class Presona {
	private $name;
	public function __construct($name){
		$this->name = $name;
	}

	public function dress(){
		echo "我的名字:".$this->name."装扮完毕".PHP_EOL;
	}
}

//客户端调用,注意:这里是累计调用,以栈的形式,先进后出
$presona = new Presona("小菜");

$presona = new Decorate3($presona);

$presona = new Decorate2($presona);

$presona = new Decorate1($presona);

$presona->dress();

  

时间: 2024-09-29 10:07:11

PHP设计模式之装饰模式的相关文章

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

设计模式之装饰模式20170726

结构型设计模式之装饰模式: 一.含义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 通俗来讲,装饰模式是对类的功能进行加强或减弱. 二.代码说明 1.主要有两个角色 1)构件 最核心.最原始.最基本的对象,也就是要装饰的对象. 2)装饰角色 把最核心.最原始.最基本的东西装饰成其他东西 2.在用C实现过程中也是参考这种思想,以修饰成绩单举例,具体实现如下: 1)装饰模式使用场景: 1 /***********************************

跟我学设计模式视频教程——装饰模式,装饰模式VS代理模式

课程视频 装饰模式 装饰模式VS代理模式1 装饰模式VS代理模式2 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--装饰模式,装饰模式VS代理模式,布布扣,bubuko.com

设计模式之装饰模式 c++实现和详细分析

Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 它使功能具有动态性 已经开发完毕的对象,后期由于业务需要,对旧的对象需要扩展特别多的功能,这时候使用给对象动态地添加新的状态或者行为(即装饰模式)方法,而不是使用子类静态继承. 引入装饰模式的原因  : 由于若有很多个功能,这么多功能 可能会出现各种组合,而每个组合都要对应一个类,这是指数级的类的数量增长(因为我们要扩展不应直接修改类,所以采取继承 而不是改变原有类)  

【设计模式】——装饰模式

装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 装饰模式结构图: Component是定义一个对象接口,可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的.至于ConcreteDecorator就是具体

学习大话设计模式06_装饰模式

装饰模式(Decorator): 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 1 /** 2 * Component 是定义一个对象接口,可以给这些对象动态地添加职责 3 * @author Monica 4 * 5 */ 6 public abstract class Component { 7 public abstract void Operation(); 8 } 9 10 11 /** 12 * ConcreteComponent 是定义了一个具体

设计模式开始--装饰模式

装饰模式 一.作用: 为已有的功能添加新的功能的设计模式,当系统需要新的功能时候,要在原有的基础上增加一点新的功能的时候,也就是装饰一点功能的时候,不需要再原有的代码上进行修改. 装饰的功能就是把核心职责和核心功能划分开了. 对比生成器模式: (1)生成器模式类执行是有顺序的 (2)装饰模式执行顺序是没有顺序的,是随机的,想怎么装饰就怎么装饰,装饰的是一些无关紧要的事情,核心的代码还是之前的类在做 二.类图 解释一下: 左边两个实现类(ConsoleLogger FileLogger)是核心的实

大话设计模式之装饰模式(包装模式)

装饰模式的结构 转发:http://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同.装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展. 装饰模式的类图如下: 在装饰模式中的角色有: ●

Java——设计模式(装饰模式_IO)

 /* * 装饰设计模式: *  对一组对象的功能进行增强时,就能够使用该模式进行问题的解决; * 装饰和继承都能实现一样的特点:  就是进行功能的扩转增强. * */ public class TestIO4 { public static void main(String[] args) { Person p = new Person(); NewPerson np = new NewPerson(p); np.chifan();//使用增强后的功能. } } //原有的类 class 

设计模式之装饰模式--- Pattern Decorator

模式的定义 装饰模式的定义: Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality. 动态给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 类型 结构类 模式的使用场景 需要扩展一个