装饰模式

设计模式—装饰者模式

有些话、适合烂在心里 提交于 2019-12-17 05:20:33
一、概念 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。 二、设计原则 多用组合,少用继承。 类应设计的对扩展开放,对修改关闭。 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。 三、要点: 装饰者和被装饰对象有相同的超类型。 可以用一个或多个装饰者包装一个对象。 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。 对象可以在任何时候被装饰,所以可以在运行时动态的,不限量的用你喜欢的装饰者来装饰对象。 装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。 四、场景 需要扩展一个类的功能,或给一个类添加附加职责。 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。 五、优缺点 优点: Decorator模式与继承关系的目的都是要扩展对象的功能

php设计模式-装饰器模式

一笑奈何 提交于 2019-12-17 03:07:18
装饰器模式概念 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能,它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 装饰器模式特点 1.装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。 2.装饰对象包含一个真实对象的引用(reference) 3. 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。 4.装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。 适用性 1. 需要扩展一个类的功能,或给一个类添加附加职责。 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。 4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。 优点 1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。 2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

python装饰器_2

孤街醉人 提交于 2019-12-16 03:28:41
由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。 >>> def now(): ... print('2015-3-25') ... >>> f = now >>> f() 2015-3-25 函数对象有一个__name__属性,可以拿到函数的名字: >>> now.__name__ 'now' >>> f.__name__ 'now' 现在,假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。 本质上,decorator就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下: def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper 观察上面的log,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。我们要借助Python的@语法,把decorator置于函数的定义处: @log def now(): print('2015-3-25') 调用now()函数,不仅会运行now(

装饰器模式学习

不羁的心 提交于 2019-12-16 01:29:27
一、装饰器模式: 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。 通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征, 耦合度高,并且随着扩展功能的增多,子类会很膨胀。 如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在 保持真实对象的类结构不变的前提下,为其提供额外的功能 ,这就是装饰模式的目标。 二、实践 2.1 定义一个接口规范 //定义了一个吃凉皮的规范 public interface ICoolNoodle { void eat(); } 2.2 普通实现类实现上述规范 //一个普通的实现类:屌丝吃凉皮 public class BoyDorisCoder implements ICoolNoodle { @Override public void eat() { System.out.println("一个男屌丝码农正在吃凉皮!"); } } //一个普通的实现类:屌丝吃凉皮 public class GirlDorisCoder implements ICoolNoodle { @Override public void eat() { System.out.println("一个女屌丝码农正在吃凉皮!"); } } 2.3 对coder吃凉皮进行增强,首先定义一个抽象类实现规范

装饰者模式

守給你的承諾、 提交于 2019-12-14 00:54:26
口诀:是你,还有你,一切拜托你 解释: 是你(继承被装饰的类),还有你(内部维护一个被装饰的类的对象),一切拜托你(主要方法还要使用该对象,在此基础上增强) 举个例子 //将BufferedReader装饰为 带行号的缓冲输入字符流,让它继承BufferedReader(是你) class BufferedLineNum2 extends BufferedReader { //在内部维护一个被装饰类的引用(还有你) BufferedReader bufferedReader ; //记录行号 int count = 1 ; //构造方法 public BufferedLineNum2 ( BufferedReader bufferedReader ) { super ( bufferedReader ) ; // 注意: 该语句没有任何的作用,只不过是为了让代码不报错,因为父类BufferedReader没有无参构造方法 this . bufferedReader = bufferedReader ; } //增强readLine方法(一切摆脱你) public String readLine ( ) throws IOException { String line = bufferedReader . readLine ( ) ; if ( line == null ) {

Java设计模式之装饰者模式

筅森魡賤 提交于 2019-12-13 22:38:10
首先呢先引入一个小问题: 想一下我们应该怎么实现它呢? 一般的情况下 可以使用继承的方法去实现如图: 这样的话很明显,类爆炸啦!有很多种组合,有没有更好的组合呢?下面就引入了装饰者模式 下面看看它的类图: 下面是具体的案例实现: //被装饰者的对象接口 public interface Drink { public float cost(); public String desc(); } //具体的被装饰者 public class Dounai implements Drink{ @Override public float cost() { return 3f; } @Override public String desc() { return "纯豆奶"; } } //装饰者的基类 public abstract class Decroator implements Drink { private Drink drink; //要装饰的对象 public Decroator(Drink drink) { this.drink = drink; } @Override public float cost() { return drink.cost(); } @Override public String desc() { return drink.desc(); } } /

Javascript 部分设计模式的个人理解

落花浮王杯 提交于 2019-12-13 12:00:06
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 9 单例模式(确保自己使用的资源都是全局的) 1)普通单体(字面量初始化对象) var person = { name : 'zhangsan', age : 12, getAge : function(){ return this.age ; } } person.height = 185 ; 这种单体在实际开发中常用在两个地方,其一就是 匿名对象,其二就是 划分命名空间! 2 )具有局部变量的单体(动态加载数据,初始化属性,返回一个对象实例) var UserInfo = (function(){ //同闭包的原 var name = ""; //利用闭包是单体有自己的私有局部变量 var code = ""; Ajax.request("url",function(n,c){ name = n; code = c; }) return { name:name, code:code } })() 3)惰性单体(用一个私有变量代替第二种方法返回的实例) var UserInfo = (function(){ var userInfo = ""; //私有变量 function init(){ //利用闭包是单体有自己的私有局部变量 var name = ""; var code = ""; Ajax

设计模式--装饰器模式

自作多情 提交于 2019-12-12 23:07:46
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 1 介绍 意图 :动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。 主要解决 :一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。 何时使用 :在不想增加很多子类的情况下扩展类。 如何解决 :将具体功能职责划分,同时继承装饰者模式。 关键代码 : 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。 应用实例 : 1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。 优点 :装饰类和被装饰类可以独立发展,不会相互耦合

装饰者模式

最后都变了- 提交于 2019-12-11 09:46:31
1. 装饰者模式(Decorator Pattern) 定义 在不改变原代码结构的情况下,动态地扩展一个对象的功能,相比继承有更灵活的实现方式。见名知意,其就是在需要增强功能的对象上包装一层代码,达到增强功能的效果 作用 装饰者模式在对象创建好之后才动态给对象增加功能,也可以选择不增加,自由灵活。而继承是在对象创建时就已经确定,继承如果要扩展功能,因为单继承原因需要多重继承,会显得麻烦臃肿 2. 实现 准备 一条汪的接口 public interface Dog { abstract void eat(); } 某汪的实现类 public class MyDog implements Dog { public void eat() { System.out.println("狗吃肉"); } } 下面我们使用装饰者模式给狗狗增加功能 2.1 首先得有装饰器 //实现Dog接口 public abstract class DogDecorator implements Dog { private Dog dog; //用构造方法来获取需要增强功能的狗狗 public DogDecorator(Dog dog) { this.dog = dog; } //调用父类狗狗的功能 public void eat() { dog.eat(); } } 2.2 用装饰器来增强功能

设计模式之☞装饰模式,通俗易懂,一学就会!!!

北慕城南 提交于 2019-12-10 23:38:06
简介   装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 功能展现 功能介绍 手机默认都有一个打电话功能 在不改变源代码的情况下,给手机增强默些功能,比如:打电话前,放首歌。。。。。。。 代码实现 手机接口类:Iphone.java package com.cyb.ssm.design_pattern.decorate; public interface Iphone { void call(); } 接口实现类(Iphone6):Iphone6.java package com.cyb.ssm.design_pattern.decorate; public class Iphone6 implements Iphone{ @Override public void call() { System.out.println("使用iphone6打电话,性能杠杠滴"); } } 装饰类( 重点 ):IphoneDecorate.java package com.cyb