装饰模式

结构模式——装饰模式

心已入冬 提交于 2020-04-07 09:58:22
视频讲解链接:(审核中......) 1.概念与结构 1.1定义   在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能。就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。   装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为。例如我们买了手机之后给手机装上手机壳,贴上手机膜等。这些,都可以说是装修模式的应用。装饰 模式与继承不一样,继承是需要一个子类来拓展对象的功能,而装饰模式则不一样,它是通过定义一个装饰类,在这个装饰类中持有某些对象的引用,然后通过使用对象之间的关联关系来取代类之间的继承关系。 1.2结构   装饰模式包含四个角色: 抽象构件(Component):它是具体构件和抽象装饰类的共同父类,声明了要在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象。抽象构件一般定义为接口。 具体构件(ConcreteComponent):它是抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰对象可以给它增加额外的职责(方法)。 抽象装饰类(Decorator):它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法

设计模式-装饰模式JAVA实现

≯℡__Kan透↙ 提交于 2020-04-06 12:21:07
装饰策略落在具体的代码实现效果上其实与代理模式的静态实现没有什么区别,都可以做到对原实现方法进行前置/后置/干预及方法替换,不必太纠结于此。 两者的差别是代理模式实际上是对被代理对象生成了一个身份一样但实现不同的对象。比如小红爱穿裙子,生成的代理对象是小粉红,她爱穿长裙子。而装饰模式相当于小红爱穿裙子,而装饰模式给她的裙子上缀了只小蝴蝶。这是两者之间的差别 装饰模式通过对顶层接口通过顶层接口进行实现后其实就走了原实现类的旁支,它实现了原来的功能,但又进行了修改。 以下仍以拣货业务进行描述 有些仓库要求在生成拣货列表的同时要打印拣货单据(无纸化仓库将拣货列表发送到手持,但小仓库可能仍需要打印拣货单据) 那么就对现有的拣货实现调整,附加一个打印单据的功能 本例中没有自己单独的顶层接口,顶层接口使用拣货任务本身的顶层接口(在建造者模式举例中的实现) package builder; import java.util.List; import bean.PickDoc; import bean.PickList; import bean.PickTask; import strategy.IPickStrategy; /** 定义要完成的动作 @author mas */ public interface IPickTask { //计算要拣货的SKU列表 public List

【装饰器模式】装饰器模式

心不动则不痛 提交于 2020-04-05 19:36:48
装饰器模式属于结构型模式,它是作为现有的类的一个包装 1、意图:   动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活 2、主要解决:   一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀 3、何时使用:   在不想增加很多子类的情况下扩展类 4、如何解决:   将具体功能职责划分,同时继承装饰者模式 5、关键代码:   1、Component 类充当抽象角色,不应该具体实现   2、修饰类引用和继承 Component 类,具体扩展类重写父类方法 6、应用实例: 1、孙悟空有 72 变,当他变成”庙宇”后,他的根本还是一只猴子,但是他又有了庙宇的功能 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体 7、优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能 8、使用场景: 1、扩展一个类的功能 2、动态增加功能,动态撤销 从图中可以看到 Circle/Rectangle 和 RedShapeDecorate是解耦的 来源: https://www.cnblogs.com/july-sunny/p

装饰者模式

无人久伴 提交于 2020-04-02 09:35:26
定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。 要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为 实际上Java 的I/O API就是使用Decorator实现的。 1 //定义被装饰者 2 public interface Human { 3 public void wearClothes(); 4 5 public void walkToWhere(); 6 } 7 8 //定义装饰者 9 public abstract class Decorator implements Human { 10 private Human human; 11 12 public Decorator(Human human) { 13 this.human = human; 14 } 15 16 public void wearClothes() { 17 human.wearClothes(); 18 } 19 20 public void walkToWhere() { 21

C#设计模式之八装饰模式(Decorator Pattern)【结构型】

别来无恙 提交于 2020-03-26 10:02:29
意图:动态地给对象增加一些额外的职责。 结构图: public abstract class Component{ public abstract void Operation(); } public class ConcreteComponent:Component{ public override void Operation(){ .... } } public abstract class Decorator : Component{ protected Component _component; protected Decorator(Component component){ _component = component; } public override void Operation(){ if(_component != null){ _component.Operation(); } } } public class ConcreteDecoratorA : Decorator{ public ConcreteDecorator(Component component) : base(component){} public override void Operation(){ base.Operation(); ..... } } public class

人人网面试经验

随声附和 提交于 2020-03-25 14:34:57
3 月,跳不动了?>>> 人人公司 的一面还是比较而基础的,基本上都是之前已经复习好到了的知识点(但是由于我的简历上写了熟悉c++和sql,所以对于这两点没有做准备,然后面试完就把简历上这两条给删了) 人人网面试经验 js设计模式(这点我在简历上写了) 工厂模式 单体(单例)模式 模块模式 观察者模式 装饰者模式 跨域的几种方式 对html5的理解 如何让一个div实现水平垂直居中 文字,图片以及内联元素 对于已经设置宽高的元素 多行文字 浮动元素 绝对定位和fixed定位的元素 行内元素和块级元素的区别 jquery中的选择器 localstorage 和cookie的区别 js设计模式(这点我在简历上写了) 之前有看过js设计模式这本书,所以还是记得几种设计模式,现在列举如下 正如您在阅读的这份文档,它使用简单的符号标识不同的标题,将某些文字标记为 粗体 或者 斜体 ,创建一个 链接 或一个脚注[^demo]。下面列举了几个高级功能,更多语法请按 Ctrl + / 查看帮助。 工厂模式 工厂模式在《JavaScript高级程序设计》中,被列为是第一种构造对象实例的方法,代码如下: function CreatePerson(name,age,sex) { var obj = new Object(); obj.name = name; obj.age = age; obj

装饰者模式 - OK

陌路散爱 提交于 2020-03-22 22:46:50
  装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。   装饰者模式隐含的是通过一条条装饰链去实现具体对象,每一条装饰链都始于一个Componet对象,每个装饰者对象后面紧跟着另一个装饰者对象,而对象链终于ConcreteComponet对象。   用粗略的话讲: 装饰模式就是为已有功能动态地添加更多功能的一种方式。   何为动态。比如打折策略。3折后再减30元再打8折,   UML图如下:        Component是定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,装饰着抽象类,继承了Component从外类来扩展Component类的功能,但对于Component来说,就无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象。起到给Component添加职责的功能。   实现代码示例:    装饰模式是利用SetComponent来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个对象分离开了。每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。    示例: namespace 装饰者模式 { class Program { static

Python装饰器的使用【面试必学】

我是研究僧i 提交于 2020-03-21 15:56:52
装饰者模式是常用的软件设计模式之一。通过此设计模式,我们能够在不修改任何底层代码情况下,给已有对象赋予新的职责。python中可以用装饰器简单地实现装饰者模式。 PS注意:很多人学Python过程中会遇到各种烦恼问题,没有人解答容易放弃。为此小编建了个Python全栈免费答疑.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,不懂的问题有老司机解决里面还有最新Python实战教程免非下,,一起相互监督共同进步! 1.1 将函数作为参数传递 在 C/C++ 中,函数指针可以将函数作为参数传递给另一函数。而在 python 中,函数也是对象的一种,函数可以被引用,也可直接作为参数传入函数,以及作为容器对象的元素。python中可以采用如下方法实现装饰者模式: #!/usr/bin/env python3.6 # -*- coding: utf-8 -*- def add(x, y): result = x+y return result def log(func): def wrapper(*args, **kwargs): result = func(*args) print(func.__name__,'has been called\n') return result return wrapper if __name__ == '__main__': print(log

java I/O库中设计模式的应用

南楼画角 提交于 2020-03-18 22:53:08
3 月,跳不动了?>>> 在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式。 在任何一种计算机语言中,输入/输出都是一个很重要的部分。与一般的计算机语言相比,java将输入/输出的功能和使用范畴做了很大的扩充。因此输入输出在java语言中占有极为重要的位置。 java语言采用流的机制来实现输入/输出。所谓流,就是数据的有序排列,流可以是从某个源(称为流源,或者 Source of Stream)出来,到某个目的(Sink of Stream)地去。根据流的方向可以将流分成输出流和输入流。程序通过输入流读取数据,想输出流写出数据。 例如:一个java程序可以使用FileInputStream类从一个磁盘文件读取数据,如下图: 像FileInputStream这样的处理器叫流处理器。一个流处理器就像一个流的管道一样,从一个流源吸入某种类型的数据,并输出某种类型的数据。上面的示意图叫流的管道图。 类似地,也可以用FileOutputStream类向一个磁盘文件写数据,如下图: 在实际的应用当中,这样简单的机制并没有太大的用处。程序需要写出的往往是非常结构话的信息,因此这些Byte类型的数据实际上是一些数字、文字、源代码等。java的I/O库提供了一个称作链接(Chaining)的机制,可以将一个流处理器与另一个流处理器首尾相接,以其中之一的输出为输入

装饰器模式

回眸只為那壹抹淺笑 提交于 2020-03-18 11:55:49
目的 :动态地给一个对象添加一些额外的职责。一般我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。在不想增加很多子类的情况下扩展类。将具体功能职责划分,同时继承装饰者模式。 使用场景: (1)需要在不影响其他对象的情况下,以动态、透明的方式给对象添加职责。 (2)如果不适合使用子类来进行扩展的时候,可以考虑使用装饰器模式。 具体例子: (1)组件对象的接口,可以给这些对象动态的添加职责 public abstract class Component { /** * 示例方法 */ public abstract void operation(); } (2)具体实现组件对象接口的对象 public class ConcreteComponent extends Component { public void operation() { //相应的功能处理 } } (3)装饰器接口,维持一个指向组件对象的接口对象, 并定义一个与组件接口一致的接口 public abstract class Decorator extends Component { /** * 持有组件对象 */ protected Component component; /** * 构造方法,传入组件对象 * @param component 组件对象 */