一、什么是装饰模式通过关联机制给类增加行为,其行为的扩展由修饰对象来决定;二、补充说明与继承相似,不同点在于继承是在编译期间扩展父类,而装饰器模式在运行期间动态扩展原有对象;或者说,继承是对类进行扩展,装饰模式是对对象进行扩展;三、角色抽象构件具体构件抽象装饰类具体装饰类说明:具体构件、抽象装饰类、具体装饰类的共同父类是抽象构件,具体装饰类继承抽象装饰类并在运行期间装饰具体构件;四、例子例子说明:...
‘‘‘
Created on 2019年11月2日@author: Administrator
‘‘‘
import timedef timefun(func):def wrappedfunc():print("start the method : %s"%(func.__name__))start = time.time()rst = func()end = time.time()print("end the method : %s"%(func.__name__))print("total cost time :", str((end-start)))return rstreturn wrappedfunc@timefun
def foo():time.sleep(1)print("I am foo")@timefun
def getInfo():return‘--...
意图:动态的将责任附加到对象上什么时候使用:1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责2.处理那些可以撤销的职责3.当不能采用生成子类的方式进行扩充时结构图: package com.test.patten.decorator;publicinterface Person {void doCoding();
}package com.test.patten.decorator;publicclass Employee implements Person {@Overridepublicvoid doCoding() {System.out.println("程序员加班写程序啊,写...
一、装饰器模式介绍
1. 解决的问题
主要解决动态地给一个对象添加一些额外的职责。
2. 定义
装饰器模式是一种结构型设计模式,允许将对象通过放入包含行为的特殊封装对象来为原对象绑定新的行为。
3. 应用场景
希望在无需修改代码的情况下即可使用对象,且希望在运行时能为对象增加额外的行为,可以使用装饰器模式。用继承来扩展对象行为的方案难以实现或者根本不可能时,可以使用装饰器模式。
二、装饰器模式优缺点
1. 优点
无需创...
装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 需要注意的有三点:
1:不改变原类文件;2:不使用继承;3:动态扩展饰器装饰的是一个接口的任何实现类,而这些实现类也包括了装饰器本身,装饰器本身也可以再被装饰。 这个类图只是装饰器模式的完整结构,但其实里面有很多可以变化的地方:1,Component接口可以是接口也可以是抽象类,甚至是...
1.概念:
以对客户透明的方式来扩展对象的功能,用户根据功能需求随意选取组成对象的成分进行动态地将责任附加到对象上,通过方法的链式调用来实现 装饰者提供了比继承更有弹性的替代方案, 简单来讲就是动态的给一个对象增加一些职能,相对与生成子类更加灵活
设计原则为:开闭原则(类应该对扩展开发,对修改关闭)
2.应用以及说明:
1装饰模式增加强了单个对象的能力。Java IO到处都使用了装饰模式,经典的例子就是Buffered系列...
1.装饰(Decorator)模式的定义指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。2.装饰模式的主要优缺点
优点:采用装饰模式扩展对象的功能比采用继承方式更加灵活。
可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。缺点:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。3. 模式的主要角色抽象构件(Component)角色:定义一个抽象接口以规...
原创文章,转载请标注出处:《Java设计模式系列-装饰器模式》
一、概述
装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能。
不同于适配器模式和桥接模式,装饰器模式涉及的是单方,和代理模式相同,而且目标必须是抽象的。
而实际上,装饰器模式和代理模式的实现方式基本一致,只在目标的存在上有些差别,这个后面我们具体讲述。
二、初步分析
上面提到了两点:涉及的是单方
目标是抽象的我们来想一下,所谓单方...
按照单一职责原则,某一个对象只专注于干一件事,而如果要扩展其职能的话,不如想办法分离出一个类来“包装”这个对象,而这个扩展出的类则专注于实现扩展功能。
装饰器模式就可以将新功能动态地附加于现有对象而不改变现有对象的功能。
1.装饰器模式
实际上Java提供的工具包中,IO相关工具就普遍大量使用了装饰器模式,例如充当装饰功能的IO类如BufferedInputStream等,又被称为高级流,通常将基本流作为高级流构造器的参数传入...
装饰器模式是指允许对一个现有的对象加入其它额外的功能并且不改变其原来的结构,属于结构型模式。这种模式通常会创建一个装饰类来包装原有的类以达到装饰的效果。以下举一个电脑配置的例子说明。首先创建一个电脑的接口,给出两个抽象方法,分别是获取名字和获取价格:/**
* 抽象电脑类
* @author 樱桃肉丸子
*/
public interface AbstractComputer {
String name();
double price();
}创建一个普通电脑类实现上面的接...
一、概述
装饰模式,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。该模式以对客户端透明的方式扩展对象的功能。
1、什么时候使用
1) 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;
2) 处理那些可以撤销的职责;
3) 当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种...
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
该设计模式是使用组合替代继承的具体实现。
使用装饰器模式
不修改图形绘制类的情况下增加绘制颜色的功能
/** 绘制图形*/
interface Shape {void draw();
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("绘制长方形");}
}class C...
问题是创建现有对象的动态增强版本.
我无法修改对象的类.相反,我必须:
>继承它>将现有对象包装在新类中>将所有原始方法调用委托给包装对象>实现由另一个接口定义的所有方法
添加到现有对象的接口是:public interface EnhancedNode {Node getNode();void setNode(Node node);Set getRules();void setRules(Set rules);Map getGroups();void setGroups(Map groups);}使用Byte Buddy,我设法子类化并实现我的界面.问题是委托给包装对...
*装饰模式字节缓冲流
BufferedInputStream bis=new BufferedInputStream(inputStream is)
BufferedOutputStream bos=new BufferedOutputStream(OutputStream os)
最底层一定是节点流
只需要释放最外层的处理流,若要手动关闭遵循从里到外的顺序关闭(从字节流到处理流)
默认为8k,可以改变//参数是字节输入流对象InputStream is =new BufferedInputStream(new InputStream(f));OutputStream os=new BufferedOutputStream(new OutputS...
我正在为Cloudera的分布式日志聚合系统Flume编写一个自定义装饰器插件.我的Java代码如下:package multiplex;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import com.cloudera.flume.conf.Context;
import com.cloudera.flume.conf.SinkFactory.SinkDecoBuilder;
import com.cloudera.flume.core.Event;
import com.cloudera.flume.core.EventImpl;
import com.cloudera.flume.core.EventSink...