- 浏览: 262348 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
cuiqi4016:
正在做json转换的功能,帮大忙了,感谢博主分享
java 通过反射获取泛型的类型 -
cxshun:
写得很好,感谢博主的分享
java 通过反射获取泛型的类型 -
joy3229233:
[url][/url][flash=200,200][/fla ...
(转)flex checkbox 选中 -
linkagebest:
盗版可耻。。。。。
(转)flex checkbox 选中 -
shuai0420:
...
flex数据绑定
装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰模式的特点;
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的索引(reference)
(3) 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
下表格列举了装饰模式和继承的不同:
装饰模式 VS 继承
装饰模式 继承
用来扩展特定对象的功能 用来扩展一类对象的功能
不需要子类 需要子类
动态地 静态地
运行时分配职责 编译时分派职责
防止由于子类而导致的复杂和混乱 导致很多子类产生,在一些场合,报漏类的层次
更多的灵活性 缺乏灵活性
对于一个给定的对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象发送消息。 对于所有可能的联合,客户期望
很容易增加任何的 困难
继承是OOP程序设计的一大特点,但其实对于很多复杂问题来说,利用继承关系处理问题往往具有很高的耦合性,不利于代码的维护。利用组合很大程度上可以做到降耦。多用组合,少用继承是OOP设计的重要思想。
装饰者模式给我们提出了一个好的OOP设计原则:类应该对扩展开放,对修改关闭 。
这句话的意思就是,如果问题发生改变,衡量一个好的设计标准就是:你不需要修改类中的代码,只需要扩展新类来适应新的行为。
《Head First Design Patterns》对装饰者模式说的很清楚。这里稍微注意几点:
(1) 装饰者和被装饰者必须具有相同的超类型。
(2) 装饰者即可以包装被装饰者,也可以包装装饰者。往往利用多层包装来达到目的。
(3) 装饰者中组合了被装饰者对象,这是装饰类的关键特征。正是由于这种组合,使得我们能够随心所欲的通过嵌套装饰来动态扩展行为。
在java类库中的IO流就是用装饰者模式设计的。JDK5.0中60多个IO流类组成了四大家族:InputStream,OutputStream,Reader,Writer。
InputStream/OutputStream是对字节序列进行操作的抽象类。
Reader/Writer是基于Unicode代码单元进行操作的抽象类。
这四大家族中大量的类都具有自己不同的功能,要做到方便的完成各种输入输出行为。必须组合使用这些类,装饰者模式是再好不过的设计了。那么IO类库如何实现装饰者模式的,我们看看几个类的部分源码:
Java代码
1. //InputStream:字节序列输入类鼻祖
2. public abstract class InputStream implements Closeable {
3. //最基本的读取字节的抽象方法,供子类扩展。
4. public abstract int read() throws IOException;
5. }
Java代码
1. //FileInputStream: 读取文件中的字节流类 继承InputStream
2. public class FileInputStream extends InputStream{
3. //构造器
4. public FileInputStream(String name) throws FileNotFoundException {
5. //.......
6. }
7. //本地方法,与操作系统低层交互的具体读入方法
8. public native int read() throws IOException;
9. }
Java代码
1. //FilterInputStream: 过滤流类,起装饰器作用,用于对输入装配各种功能
2. public class FilterInputStream extends InputStream {
3. //用于记录被装饰者,也就是需要装配新功能的InputStream对象
4. protected volatile InputStream in;
5. //构造装饰器
6. protected FilterInputStream(InputStream in) {
7. this.in = in; //设置需要被包装InputStream对象
8. }
9. //读入字节
10. public int read() throws IOException {
11. return in.read();
12. }
13. }
Java代码
1. //BufferedInputStream: 使输入流具有缓冲功能,是一种可以装配缓冲功能的装饰器,继承FilterInputStream
2. public class BufferedInputStream extends FilterInputStream {
3. //构造器
4. public BufferedInputStream(InputStream in) {
5. this(in, defaultBufferSize); //in就是被装配缓冲功能的InputStream
6. }
7. }
这四个类同属于InputStream家族,他们就是一个经典的装饰器模式设计。其中
InputStream 具有读入功能的抽象被装饰器。
FileInputStream 具有读入文件功能的具体被装饰器。
FilterInputStream 具备装饰器的抽象意义。
BufferedInputStream 具有具体功能(缓冲功能)的装饰器。
这个时候后我想设计一个具有缓冲功能的读取文件中的字节的行为:
Java代码
1. public void IOTest{
2. //缓冲装饰器包装文件字节输入流
3. BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C://decorator.txt"));
4. //读取内容
5. bis.read();
6. }
IO类库中还有很多其他的装饰器,比如处理基本数据类型的DataInputStream,处理ZIP文件流的ZipInputStream,等等。只要我们想的到的行为,都可以用这些装饰器包装组合来完成。就这一点,装饰器绝对是Perfect。
但是装饰器模式也有一个算不上缺点,但也不太好的地方。这种设计常常造成大量的小类存在,数量之大可能会给类消费者很大的困扰。是吧!学习Java的IO流是不是特痛苦呀......
备注:JDK中的集合类库也使用了装饰者模式,
装饰模式的特点;
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的索引(reference)
(3) 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
下表格列举了装饰模式和继承的不同:
装饰模式 VS 继承
装饰模式 继承
用来扩展特定对象的功能 用来扩展一类对象的功能
不需要子类 需要子类
动态地 静态地
运行时分配职责 编译时分派职责
防止由于子类而导致的复杂和混乱 导致很多子类产生,在一些场合,报漏类的层次
更多的灵活性 缺乏灵活性
对于一个给定的对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象发送消息。 对于所有可能的联合,客户期望
很容易增加任何的 困难
继承是OOP程序设计的一大特点,但其实对于很多复杂问题来说,利用继承关系处理问题往往具有很高的耦合性,不利于代码的维护。利用组合很大程度上可以做到降耦。多用组合,少用继承是OOP设计的重要思想。
装饰者模式给我们提出了一个好的OOP设计原则:类应该对扩展开放,对修改关闭 。
这句话的意思就是,如果问题发生改变,衡量一个好的设计标准就是:你不需要修改类中的代码,只需要扩展新类来适应新的行为。
《Head First Design Patterns》对装饰者模式说的很清楚。这里稍微注意几点:
(1) 装饰者和被装饰者必须具有相同的超类型。
(2) 装饰者即可以包装被装饰者,也可以包装装饰者。往往利用多层包装来达到目的。
(3) 装饰者中组合了被装饰者对象,这是装饰类的关键特征。正是由于这种组合,使得我们能够随心所欲的通过嵌套装饰来动态扩展行为。
在java类库中的IO流就是用装饰者模式设计的。JDK5.0中60多个IO流类组成了四大家族:InputStream,OutputStream,Reader,Writer。
InputStream/OutputStream是对字节序列进行操作的抽象类。
Reader/Writer是基于Unicode代码单元进行操作的抽象类。
这四大家族中大量的类都具有自己不同的功能,要做到方便的完成各种输入输出行为。必须组合使用这些类,装饰者模式是再好不过的设计了。那么IO类库如何实现装饰者模式的,我们看看几个类的部分源码:
Java代码
1. //InputStream:字节序列输入类鼻祖
2. public abstract class InputStream implements Closeable {
3. //最基本的读取字节的抽象方法,供子类扩展。
4. public abstract int read() throws IOException;
5. }
Java代码
1. //FileInputStream: 读取文件中的字节流类 继承InputStream
2. public class FileInputStream extends InputStream{
3. //构造器
4. public FileInputStream(String name) throws FileNotFoundException {
5. //.......
6. }
7. //本地方法,与操作系统低层交互的具体读入方法
8. public native int read() throws IOException;
9. }
Java代码
1. //FilterInputStream: 过滤流类,起装饰器作用,用于对输入装配各种功能
2. public class FilterInputStream extends InputStream {
3. //用于记录被装饰者,也就是需要装配新功能的InputStream对象
4. protected volatile InputStream in;
5. //构造装饰器
6. protected FilterInputStream(InputStream in) {
7. this.in = in; //设置需要被包装InputStream对象
8. }
9. //读入字节
10. public int read() throws IOException {
11. return in.read();
12. }
13. }
Java代码
1. //BufferedInputStream: 使输入流具有缓冲功能,是一种可以装配缓冲功能的装饰器,继承FilterInputStream
2. public class BufferedInputStream extends FilterInputStream {
3. //构造器
4. public BufferedInputStream(InputStream in) {
5. this(in, defaultBufferSize); //in就是被装配缓冲功能的InputStream
6. }
7. }
这四个类同属于InputStream家族,他们就是一个经典的装饰器模式设计。其中
InputStream 具有读入功能的抽象被装饰器。
FileInputStream 具有读入文件功能的具体被装饰器。
FilterInputStream 具备装饰器的抽象意义。
BufferedInputStream 具有具体功能(缓冲功能)的装饰器。
这个时候后我想设计一个具有缓冲功能的读取文件中的字节的行为:
Java代码
1. public void IOTest{
2. //缓冲装饰器包装文件字节输入流
3. BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C://decorator.txt"));
4. //读取内容
5. bis.read();
6. }
IO类库中还有很多其他的装饰器,比如处理基本数据类型的DataInputStream,处理ZIP文件流的ZipInputStream,等等。只要我们想的到的行为,都可以用这些装饰器包装组合来完成。就这一点,装饰器绝对是Perfect。
但是装饰器模式也有一个算不上缺点,但也不太好的地方。这种设计常常造成大量的小类存在,数量之大可能会给类消费者很大的困扰。是吧!学习Java的IO流是不是特痛苦呀......
备注:JDK中的集合类库也使用了装饰者模式,
发表评论
-
JVM内存管理:深入垃圾收集器与内存分配策略
2012-09-29 09:40 916转自http://icyfenix.iteye.com ... -
javaVM 内存管理
2012-09-29 09:18 1039转自http://icyfenix.iteye.com/blo ... -
使用J2SE API读取Properties文件的六种方法
2012-03-15 11:46 9411。使用java.util.Properties ... -
java设计模式 -Decorator
2012-03-01 16:05 967//抽象构件角色 abstract public c ... -
设计模式------Decorator
2012-03-01 14:29 805一、学习装饰着模式 1、定义及作用 该模式以对 ... -
正则表达式学习
2011-12-31 09:56 1061//正则表达式去掉中文 public static vo ... -
System.gc()
2011-06-24 17:40 1034最近在在翻看java的Garbage Collection,即 ... -
java gc(转)
2011-06-24 16:07 970<%@ page contentType="t ... -
hibernate
2011-06-24 11:29 01.hibernate lazy, inverse, casc ... -
详解spring事务属性(转)
2011-06-10 10:46 819Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我 ... -
spring心得(转)
2011-06-03 11:00 8411、spring原理 s ... -
实战Concurrent
2011-05-30 17:45 915编写多线程的程序一直都是一件比较麻烦的事情,要考虑很多事情,处 ... -
Memcached(转)
2011-05-30 17:32 954我对于Memcached的接触,还是在去年看了CSDN的一系列 ... -
动态创建代理(转)
2011-04-21 11:22 1053随着Proxy的流行,Sun把它纳入到JDK1.3实现了Jav ... -
代理模式(转)
2011-04-21 11:17 901代理模式是常用的Java 设计模式,它的特征是代理类与委托类有 ... -
工厂模式
2011-04-18 15:35 1051简单工厂,工厂方法和 ... -
java 通过反射获取泛型的类型
2011-03-24 13:34 32175jdk1.5开始支持泛型,所以我们有时需要把泛型里定义的对象的 ... -
java反射学习(转)
2011-03-22 15:51 1010Java提供了一套机制来动态执行方法和构造方法,以及数组操作等 ... -
java反射(转)
2011-03-22 15:29 970Java的反射机制是Java特 ... -
Quartz学习
2010-11-09 13:20 9321.与Spring集成 Spring中与quartz 的结合方 ...
相关推荐
首先,Decorator模式的核心组件包括抽象组件(Component)、具体组件(Concrete Component)、装饰器(Decorator)以及具体装饰器(Concrete Decorator)。抽象组件定义了对象的基本接口,所有组件都必须实现这个...
Java的`Decorater`类通过持有并调用被装饰对象的方法实现。 8. **外观模式**:提供一个统一的接口,使得子系统更容易使用。在Java中,可以创建一个公共的接口或类,将多个子系统的接口封装在一起。 9. **桥接模式*...
在提供的例子中,`decorater`函数就是一个装饰器,它在调用原函数`house`前后添加了一些额外的操作,如模拟装修过程。通过装饰器,我们可以轻松地为多个函数添加相同的行为,如日志记录、性能测试、权限验证等。 ...
"js_painter_decorater_lab"可能是一个实验项目,旨在帮助开发者理解并实践JavaScript中的装饰器模式。在这个实验中,你可能会接触到如何使用装饰器来增强或修改对象的行为,特别是与绘画相关的功能。 装饰器是ES7...
第三章 装饰着模式 decorater 第四章 工厂模式 factory 第五章 封装调用 methodinvocation 第六章 适配器 adapter 第七章 模板方法 template 第八章 迭代器与组合模式 iterator 第九章 状态模式 statepattern 第十章...
装饰器是一种设计模式,在不修改原函数代码的情况下增加其功能。装饰器本质上是一个接收函数作为参数的高阶函数,并返回一个新的函数。 **装饰器的一般形式**: ```python def decorator(func): def wrapper(*...
python selenium excelLibrary wxPython decorater3.4python selenium excelLibrary wxPython decorater3.4 搭建robotframework环境所有工具都有,以及安装步骤文档
xml文件真子数学urllib2使用方法(示例) usage: tc_mm_decorater.py [-h] [-u] [-t REFRESH_TIME] [-r ROUND_ID] [-T TITLE] [-d DIR]第一次运行从 Feed 中获取 Coder 数据,因此需要一些时间。默认情况下,HTML ...
特制指标 这是Thoth的Promotheus指标出口商。 在本地设置指标导出器 从.env.template创建一个.env文件。 填充.env的所有值.env ,继续执行pipenv install --dev 。 oc登录到Openshift集群。... 使用decorater @r