- 浏览: 1681095 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (335)
- uml (11)
- java (318)
- python (11)
- socket (2)
- ant (1)
- data structures (58)
- algorithms (67)
- concurrency (16)
- multithreading (16)
- mysql (2)
- ubuntu (2)
- c语言 (1)
- lucene (0)
- elasticsearch (0)
- django (1)
- 读书 观点 (2)
- 读书 (4)
- 观点 (4)
- collections (8)
- nio (1)
- io (2)
- 系统集成 (1)
- activemq (2)
- restful (0)
- web service (0)
- HttpClient (1)
- serializable (0)
- annotation (1)
- jdbc (3)
- classloader (0)
- regular expression (1)
- jpa (4)
- jvm (0)
- reflection (1)
- commons-pool2 (2)
- javamail (1)
- velocity (1)
- mathematics (3)
- graph (13)
- LeetCode (159)
- scala (0)
- spring (24)
- maven (5)
- spring batch (1)
- quartz (2)
- IOC (2)
- ORM (3)
- hibernate (2)
- aop (4)
- redis (0)
- zookeeper (0)
- spring mvc (4)
- ELK (1)
- string (1)
- gradle (1)
- mybatis (5)
- docker (0)
- servlet (0)
- log4j2 (1)
- html (0)
- css (0)
最新评论
-
nucleus:
貌似是因为图片的路径是http的缘故:http://dl2.i ...
spring container 实现分析:BeanWrapper -
nucleus:
nucleus 写道BeanWrapper这一块相关的类结构如 ...
spring container 实现分析:BeanWrapper -
nucleus:
BeanWrapper这一块相关的类结构如下图:文中提到的上述 ...
spring container 实现分析:BeanWrapper -
leshy:
inventory.sort(Comparator.compa ...
java8 lambda表达式学习总结 -
Leisurez:
di1984HIT 写道xuexile~hahaha~
activemq的几种基本通信方式总结
Decorator之前
在Java程序中,我们常会在IO的时候用到类似于如下的代码:
InputStream in = new BufferedInputStream( new FileInputStream("test.txt"));
从代码本身的直观意义来说,这部分代码很好理解。
1.使用FileInputStream打开test.txt文件。使用BufferedInputStream类封装了这个类之后,返回的对象就具备了缓冲部分数据的功能。
2. 比较有意思的一点在于,虽然我们用BufferedInputStream封装了前面的对象,但是我们还是可以把它当成一个InputStream类的对象来使用。
粗粗看来,这种写法似乎也没有什么特殊的。假定我们自己从最初的角度来设计这个问题,可能会采用一个类似于继承的办法,如下图所示:
这种设想的一个基本点是,如果每次需要对原有的类做增强的时候,我们可以通过对在原有类的基础上派生出一个新的类来。这样既不会修改原来的类,也可以实现良好的可扩充。
回头看前面那个示例代码,我们会发现这样的设计其实会存在一个隐藏的问题的。
1.如前面所示,如果我们每次需要增加新的功能的时候,都继承一个新的类出来。如果我们需要一个既有FileInputStream类的特性同时又有BufferedInputStream的特性的类呢?这下问题就来了,如果我们继续继承这两个类的话,可能就需要定义一个新的类。或者我们也可以再从InputStream派生一个新的类,有两个类的特性。这样的话,我们可能就不可避免的在新的类中要重复部分FileInputStream和BufferedInputStream的代码。重复的代码显得比较讨厌,你懂的。
2. 如果我们需要一个类具有多种特性呢?比如说,我既要有BufferedInputStream的特性,然后还需要一些自定义的特性,比如说将里面某些字符的大小写变化一下。那该怎么办呢?总不能再去从多个类中间来继承吧?如果这样的话,我们在类继承结构中每增加一种新的特性,这个新的特性就可能和其他的类可能形成一种组合的关系。如果再考虑到组合的顺序和次数的话...显然,类会呈现出一个爆炸式的增长。
综上所述,问题的根源在于,我们要求类能够根据多个不同的特性部分进行灵活的组合时,采用继承的方法是不合适的。
Decorator的引申和推导
现在我们看看decorator模式的uml图:
这个图中间有几个比较有意思的地方,
1. ConcreteComponent是某一个具体的类,相当于前面的FileInputStream。它是作为一个封装的最核心部分。就好像是包包子的馅,没有它就不能成为包子了。
2. ConcreteDecoratorA,B这些类都有一个封装的对象,然后每个具体的类针对该封装的对象来添加新的特性。这就像是往包子馅外面裹皮,具体是裹成什么样的就看你要添加什么新特性。
3. 还有一个问题就是一直让人开始比较困惑的。既然前面的设计方式会带来类爆炸的问题,这个设计是怎么解决的呢?问题的关键点就在于Decorator类和ConcreteDecorator类的继承。通过Decorator类具体封装了一个ConcreteComponent对象。因为继承自同一个类,我们可以把它当成一个父类对待。同样,每个具体的ConcreteDecorator在添加新的特性时,就相当于在一个封装的对象里添加东西,而不需要去继承。而且比较有意思的是,我们这么封装后的对象,也可以当成一个抽象的父类进行进一步的封装。这种设计思想不是正好利用到了常用的一个设计原则么?优先考虑组合而不是继承。
Decorator模式在Java I/O包中的应用
Decorator模式可以说在java的IO包里头得到了重度的应用。一个典型的和InputStream类关联的类关系图就可见一斑:
从图中我们可以看到,InputStream就相当于最高的父类。而FileInputStream, StringBufferInputStream...这几个类相当于用来被包装核心。如最前面的代码所示,它们只能用在最里边。而那些用来包装的类如BufferedInputStream...这些都继承自FilterInputStream类。FilterInputStream相当于前面的Decorator类。
总结
如果把前面那部分弄明白之后,再来看java io包中间的类的时候就不会觉得很晕了。可以简单的做一个这样的归纳。
Java IO一般分为两类,一类是面向字节的,采用InputStream或者OutputStream。还有一类是面向字符的,采用Reader和Writer。而针对这些所有的类的结构都采用了Decorator的结构。所以,根据命名的约定,我们就可以很容易猜出里面哪些类是干什么的以及在这个类结构中起什么作用。用一句话来概括java io包中的类的话,就是这个包中基本上就是包含了InputStream, OutputStream,Reader和Writer这四大家族和他们的小喽罗们:)
发表评论
-
spring源代码分析:aop的实现
2018-10-03 23:32 735简介 在之前的文章里我们讨论过一些程序构建Pro ... -
java annotation基础
2018-06-30 16:41 882简介 之前有一篇简短的文章讨论过annotati ... -
spring源代码分析:annotation支持的实现
2018-09-03 23:31 2546简介 在之前的文章里,我们讨论了spring I ... -
spring container 实现分析:BeanFactory and ApplicationContext
2018-06-02 18:29 1465简介 在之前的文章里,我们讨论过作为spring ... -
spring aop: ProxyFactory
2018-04-30 16:45 837简介 在之前的文 ... -
日志与log4j2的配置和应用总结
2018-02-15 15:47 12310简介 通常我们在日常的应用开发中,日志起到一个非 ... -
Java servlet学习总结
2018-01-02 21:14 0简介 应用系统架构的演化(从CS到BS) ... -
spring container 实现分析:BeanWrapper
2018-02-19 18:10 1980简介 在之前的一篇文章里, 我们基于《Exper ... -
spring propertyeditor
2017-10-26 09:17 0pro spring 5 chapter 4, page ... -
spring bean life cycle
2018-02-25 13:30 923简介 在使用spring bean的过程中,有一个 ... -
spring container的设计与实现分析
2017-10-08 21:31 2766简介 在之前的一 ... -
jdbc数据访问的封装和演化
2017-09-16 17:00 2688简介 在使用传统jdbc的方式来访问数据的时候, ... -
Boyer Moore算法分析总结
2017-03-31 18:42 3551简介 在之前的文章里,对于字符串的搜索算法,我曾 ... -
mybatis学习总结:mybatis和spring, spring boot的集成
2017-03-04 18:07 2508简介 在前面的讨论里已经提到了mybatis的各种配置 ... -
mybatis学习总结:annotation与xml结合示例
2017-02-25 21:09 3699简介 在之前的文章里讨论过mybatis纯xml或者 ... -
mybatis学习总结:对象关系映射的xml配置实现
2017-02-19 23:03 4064简介 在之前的文章里已经讨论过mybatis的基本配 ... -
mybatis学习总结:annotation示例改进
2017-01-24 09:06 3436简介 在前一篇文 ... -
mybatis学习总结:基础示例
2017-01-21 23:30 895简介 mybatis是一个比较流行的ORM框架, ... -
gradle学习总结
2016-12-18 21:01 4625简介 Java的自动化构建工具比较多,从最开始的an ... -
String sort的几种方法
2016-10-16 23:07 2183简介 在之前的一 ...
相关推荐
在"DecoratorPattern.rar"这个压缩包中,包含了装饰器模式的简单案例demo和一个使用MindMaster绘制的脑图。通过这个案例,我们可以深入理解装饰器模式的工作原理和应用场景。 1. 装饰器模式的基本结构: - ...
Java的IO模型采用了装饰者模式(Decorator Pattern),这使得开发者可以根据具体需求动态地组合不同的流类来构建所需的IO功能。例如,如果需要一个具有缓冲功能的文件输入流,可以通过组合`FileInputStream`和`...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...
它提供了一个面向对象的API,并且在Java IO库中采用了装饰器模式(Decorator Pattern)来减少类的数量,使得整个框架既灵活又易于扩展。Java的IO系统主要由两大块组成: 1. **堵塞型IO (Blocking IO)**:位于`java.io...
这段代码展示了 Java 中常见的 IO 处理方式,同时引出了一个重要的设计模式——装饰者模式(Decorator Pattern)。装饰者模式是一种结构型设计模式,用于在不改变现有对象结构的情况下动态地给该对象添加新的功能。 ...
在Java中,`java.io.InputStreamReader`和`java.io.OutputStreamWriter`是字符流和字节流之间的适配器。 6. 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们可以独立变化。Java集合框架中的`List`, ...
7. 装饰器模式(Decorator Pattern):装饰器模式动态地给一个对象添加额外的职责,如`java.io.InputStream`和`java.io.FilterInputStream`,后者可以在不改变原有行为的基础上增加新的功能。 8. 桥接模式(Bridge ...
5. **装饰器模式(Decorator Pattern)**:动态地给一个对象添加一些额外的职责,可以独立增加功能,同时保持接口一致。Java中的IO流类库就大量使用了装饰器模式。 6. **适配器模式(Adapter Pattern)**:将一个类...
Java的IO流设计就广泛应用了装饰器模式,例如BufferedReader和InputStreamReader等。 此外,阎宏的书可能还会涵盖其他设计模式,如策略模式、适配器模式、桥接模式、建造者模式等,以及如何在Java中有效地使用这些...
4. **装饰器模式**(Decorator Pattern):动态地给对象添加新的行为或责任,而不影响其他对象。Java的IO流就是很好的例子。修改可能包括扩展更多的装饰类,以提供更多功能组合。 5. **策略模式**(Strategy ...
Java SE中的IO流是用于Java程序中输入和输出操作的一种机制,它将数据处理看作是水流的方式,通过“流”的方式进行读写操作。J2SDK提供了多种流类,以处理不同类型的数据。流的概念来源于现实世界中的水流,形象地...
装饰器模式(Decorator Pattern)是一种结构型设计模式,用于在运行时为对象添加新的行为或职责,而无需修改其原有代码。Java的IO流系统就是装饰器模式的一个经典应用。 代理模式(Proxy Pattern)同样属于结构型...
5. **装饰器模式**(Decorator Pattern):动态地给一个对象添加一些额外的职责,既扩展了功能,又不破坏封装性。在Java IO流体系中广泛应用。 6. **代理模式**(Proxy Pattern):为其他对象提供一种代理以控制对...
- 装饰模式(Decorator pattern):动态地给对象添加新的行为或责任,如Java IO中的`BufferedReader`和`BufferedWriter`。 2. **设计模式的含义**: 设计模式是对在软件设计过程中遇到的常见问题的解决方案,是可...
这种模式常用于扩展功能,例如在Java的IO流中,`InputStream`, `OutputStream` 及其各种装饰类如`BufferedInputStream`, `PrintStream`等就是很好的例子。 3. 工厂模式(Factory Pattern):作为创建型模式,工厂...
Java IO 到处都使用了装饰模式,典型例子就是 Buffered 系列类如 BufferedReader 和 BufferedWriter,它们增强了 Reader 和 Writer 对象,以实现提升性能的 Buffer 层次的读取和写入。 五、Java 设计模式的应用场景...
在Java IO库中,`BufferedReader`和`BufferedWriter`是装饰器模式的实例,它们为`Reader`和`Writer`添加了缓冲功能。 5. **设计模式的分类**: - **创建型模式**:包括工厂方法、抽象工厂、单例、建造者和原型模式...
2. **文件系统监控**:通过Java的`java.io.File`类和相关的I/O流,可以监控指定目录下的文件变化,检测潜在的安全威胁。 3. **网络请求监测**:利用Java的`java.net`包,可以创建网络套接字(Socket)来监听和分析...