Java设计模式---装饰模式
装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
装饰模式的结构
装饰模式以对客户透明的方式动态地给一个对象附加上一些责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。
装饰模式的类图如下:
aaarticlea/png;base64,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" alt="" />
在装饰模式中的角色有:
● 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
● 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
● 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
● 具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。
源代码
抽象构件角色
public interface Component { public void sampleOperation(); }
具体构件角色
public class ConcreteComponent implements Component { @Override
public void sampleOperation() {
// 写相关的业务代码
} }
装饰角色
public class Decorator implements Component{
private Component component; public Decorator(Component component){
this.component = component;
} @Override
public void sampleOperation() {
// 委派给构件
component.sampleOperation();
} }
具体装饰角色
public class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) {
super(component);
} @Override
public void sampleOperation() {
super.sampleOperation();
// 写相关的业务代码
}
}
public class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) {
super(component);
} @Override
public void sampleOperation() {
super.sampleOperation();
// 写相关的业务代码
}
}
装饰模式的简化
大多数情况下,装饰模式的实现都要比上面给出的示意性例子要简单。
如果只有一个ConcreteComponent类,那么可以考虑去掉抽象的Component类(接口),把Decorator作为一个ConcreteComponent子类。如下图所示:
aaarticlea/png;base64,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" alt="" />
如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。甚至在只有两个ConcreteDecorator类的情况下,都可以这样做。如下图所示:
aaarticlea/png;base64,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" alt="" />
透明性的要求
装饰模式对客户端的透明性要求程序不要声明一个ConcreteComponent类型的变量,而应当声明一个Component类型的变量。
半透明的装饰模式
然而,纯粹的装饰模式很难找到。装饰模式的用意是在不改变接口的前提下,增强所考虑的类的功能。在增强功能的时候,往往需要建立新的公开方法。
这就导致了大多数的装饰模式的实现都是“半透明”的,而不是完全透明的。换言之,允许装饰模式改变接口,增加新的方法。这意味着客户端可以声明ConcreteDecorator类型的变量,从而可以调用ConcreteDecorator类中才有的方法:
TheGreatestSage sage = new Monkey();
Bird bird = new Bird(sage);
bird.fly();
半透明的装饰模式是介于装饰模式和适配器模式之间的。适配器模式的用意是改变所考虑的类的接口,也可以通过改写一个或几个方法,或增加新的方法来增强或改变所考虑的类的功能。大多数的装饰模式实际上是半透明的装饰模式,这样的装饰模式也称做半装饰、半适配器模式。
装饰模式的优点
(1)装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。
(2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
装饰模式的缺点
由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
设计模式在JAVA I/O库中的应用
装饰模式在Java语言中的最著名的应用莫过于Java I/O标准库的设计了。
由于Java I/O库需要很多性能的各种组合,如果这些性能都是用继承的方法实现的,那么每一种组合都需要一个类,这样就会造成大量性能重复的类出现。而如果采用装饰模式,那么类的数目就会大大减少,性能的重复也可以减至最少。因此装饰模式是Java I/O库的基本模式。
Java I/O库的对象结构图如下,由于Java I/O的对象众多,因此只画出InputStream的部分。
aaarticlea/png;base64,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" alt="" />
根据上图可以看出:
● 抽象构件(Component)角色:由InputStream扮演。这是一个抽象类,为各种子类型提供统一的接口。
● 具体构件(ConcreteComponent)角色:由ByteArrayInputStream、FileInputStream、PipedInputStream、StringBufferInputStream等类扮演。它们实现了抽象构件角色所规定的接口。
● 抽象装饰(Decorator)角色:由FilterInputStream扮演。它实现了InputStream所规定的接口。
● 具体装饰(ConcreteDecorator)角色:由几个类扮演,分别是BufferedInputStream、DataInputStream以及两个不常用到的类LineNumberInputStream、PushbackInputStream。
半透明的装饰模式
装饰模式和适配器模式都是“包装模式(Wrapper Pattern)”,它们都是通过封装其他对象达到设计的目的的,但是它们的形态有很大区别。
理想的装饰模式在对被装饰对象进行功能增强的同时,要求具体构件角色、装饰角色的接口与抽象构件角色的接口完全一致。而适配器模式则不然,一般而言,适配器模式并不要求对源对象的功能进行增强,但是会改变源对象的接口,以便和目标接口相符合。
装饰模式有透明和半透明两种,这两种的区别就在于装饰角色的接口与抽象构件角色的接口是否完全一致。透明的装饰模式也就是理想的装饰模式,要求具体构件角色、装饰角色的接口与抽象构件角色的接口完全一致。相反,如果装饰角色的接口与抽象构件角色接口不一致,也就是说装饰角色的接口比抽象构件角色的接口宽的话,装饰角色实际上已经成了一个适配器角色,这种装饰模式也是可以接受的,称为“半透明”的装饰模式,如下图所示。
aaarticlea/png;base64,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" alt="" />
在适配器模式里面,适配器类的接口通常会与目标类的接口重叠,但往往并不完全相同。换言之,适配器类的接口会比被装饰的目标类接口宽。
显然,半透明的装饰模式实际上就是处于适配器模式与装饰模式之间的灰色地带。如果将装饰模式与适配器模式合并成为一个“包装模式”的话,那么半透明的装饰模式倒可以成为这种合并后的“包装模式”的代表。
InputStream类型中的装饰模式
InputStream类型中的装饰模式是半透明的。为了说明这一点,不妨看一看作装饰模式的抽象构件角色的InputStream的源代码。这个抽象类声明了九个方法,并给出了其中八个的实现,另外一个是抽象方法,需要由子类实现。
public abstract class InputStream implements Closeable { public abstract int read() throws IOException; public int read(byte b[]) throws IOException {} public int read(byte b[], int off, int len) throws IOException {} public long skip(long n) throws IOException {} public int available() throws IOException {} public void close() throws IOException {} public synchronized void mark(int readlimit) {} public synchronized void reset() throws IOException {} public boolean markSupported() {} }
下面是作为装饰模式的抽象装饰角色FilterInputStream类的源代码。可以看出,FilterInputStream的接口与InputStream的接口是完全一致的。也就是说,直到这一步,还是与装饰模式相符合的。
public class FilterInputStream extends InputStream {
protected FilterInputStream(InputStream in) {} public int read() throws IOException {} public int read(byte b[]) throws IOException {} public int read(byte b[], int off, int len) throws IOException {} public long skip(long n) throws IOException {} public int available() throws IOException {} public void close() throws IOException {} public synchronized void mark(int readlimit) {} public synchronized void reset() throws IOException {} public boolean markSupported() {}
}
下面是具体装饰角色PushbackInputStream的源代码。
public class PushbackInputStream extends FilterInputStream {
private void ensureOpen() throws IOException {} public PushbackInputStream(InputStream in, int size) {} public PushbackInputStream(InputStream in) {} public int read() throws IOException {} public int read(byte[] b, int off, int len) throws IOException {} public void unread(int b) throws IOException {} public void unread(byte[] b, int off, int len) throws IOException {} public void unread(byte[] b) throws IOException {} public int available() throws IOException {} public long skip(long n) throws IOException {} public boolean markSupported() {} public synchronized void mark(int readlimit) {} public synchronized void reset() throws IOException {} public synchronized void close() throws IOException {}
}
查看源码,你会发现,这个装饰类提供了额外的方法unread(),这就意味着PushbackInputStream是一个半透明的装饰类。换言 之,它破坏了理想的装饰模式的要求。如果客户端持有一个类型为InputStream对象的引用in的话,那么如果in的真实类型是 PushbackInputStream的话,只要客户端不需要使用unread()方法,那么客户端一般没有问题。但是如果客户端必须使用这个方法,就 必须进行向下类型转换。将in的类型转换成为PushbackInputStream之后才可能调用这个方法。但是,这个类型转换意味着客户端必须知道它 拿到的引用是指向一个类型为PushbackInputStream的对象。这就破坏了使用装饰模式的原始用意。
现实世界与理论总归是有一段差距的。纯粹的装饰模式在真实的系统中很难找到。一般所遇到的,都是这种半透明的装饰模式。
下面是使用I/O流读取文件内容的简单操作示例。
public class IOTest { public static void main(String[] args) throws IOException {
// 流式读取文件
DataInputStream dis = null;
try{
dis = new DataInputStream(
new BufferedInputStream(
new FileInputStream("test.txt")
)
);
//读取文件内容
byte[] bs = new byte[dis.available()];
dis.read(bs);
String content = new String(bs);
System.out.println(content);
}finally{
dis.close();
}
} }
观察上面的代码,会发现最里层是一个FileInputStream对象,然后把它传递给一个BufferedInputStream对象,经过BufferedInputStream处理,再把处理后的对象传递给了DataInputStream对象进行处理,这个过程其实就是装饰器的组装过程,FileInputStream对象相当于原始的被装饰的对象,而BufferedInputStream对象和DataInputStream对象则相当于装饰器。
Android 装饰器模式的实例:
Context类中也存在装饰者模式的运用,大家看源码中
abstract class Context
是抽象类就是装饰者模式的Component:组件对象接口。- 而真正的实现是在ContextImpl中完成,它继承自Context抽象类并实现抽象方法。是ConcreteComponent:具体的组件对象,实现组件对象接口,就是被装饰的原始对象。
- 而Decorator所有装饰器的抽象父类是ContextWrapper。从代码上看是完全和装饰者模式一样的实现。内部持有一个Component对象,就是持有一个被装饰的对象。
public class ContextWrapper extends Context {
Context mBase; public ContextWrapper(Context base) {
mBase = base;
} //省略代码 只看这个方法
@Override
public void startActivity(Intent intent) {
mBase.startActivity(intent);
}
- 最后谁是具体的装饰器对象呢?其实就是我们的Activity、Service和Application这些能够启动Activity的实现类啊。只是我们一般没有重写startActivity()方法由系统调用了我们没有注意到。
借用一张UML图可以很好的说明它们之前的关系:
Java设计模式---装饰模式的更多相关文章
- Java设计模式-装饰模式(Decorator)
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...
- Java设计模式—装饰模式
装饰模式是一种比较常见的模式. 定义为:动态的给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更加灵活. 装饰模式的通用类图如下: 装饰模式的构成: 1) 抽象构件(Component ...
- Java设计模式——装饰模式
转载自:http://blog.csdn.net/xu__cg/article/details/53024490 抽象构件 public interface CarInterface { void m ...
- Java设计模式学习记录-装饰模式
前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一 ...
- Java设计模式(7)装饰模式(Decorator模式)
Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
随机推荐
- 重新开始学习javase_集合_Map
一,Map之HashMap(转:http://blog.csdn.net/zheng0518/article/details/42197049) 1. HashMap概述: HashMap是基于 ...
- 你好,C++(35)类是如何藏私房钱的?6.2.4 拷贝构造函数
6.2.6 类成员的访问控制 类成员包括类的成员变量和成员函数,它们分别用来描述类的属性和行为.而类成员的访问控制决定了哪些成员是公开的,可以被外界访问,也可以被自身访问:哪些成员是私有的,只能在类 ...
- 144 Binary Tree Preorder Traversal(二叉树先序遍历Medium)
题目意思:二叉树先序遍历,结果存在vector<int>中 解题思路:1.递归(题目中说用递归做没什么意义,我也就贴贴代码吧) 2.迭代 迭代实现: class Solution { pu ...
- HDU-1799(组合递推公式)
HDOJ-1799 - Fighting_Dream M - 暴力求解.打表 Time Limit:1000MS Memory Limit:32768KB 64bit IO Forma ...
- Unity扩展编辑器--类型1:Editor Windows
Extending the Editor Unity允许你使用自己定制的inspectors和Editor Windows扩展编辑器,并且你可以使用定制的Property Drawers定义属性集在i ...
- Rxjava+Retrofit2+Okhttp3多文件上传(服务器端代码+客户端代码)
所有代码亲测可用,如有问题,欢迎指正. 首先在ApiService接口文件中新建文件上传接口 public interface ApiService { static final String BAS ...
- winform拖动无边框窗体
这个无边框拖动船体,代码很少,却总是记不住,于是就在网上搜了这段代码,记录一下,省的再忘 using System; using System.Collections.Generic; using S ...
- SCALA常规练习C
package com.hengheng.scala abstract class Animal { def walk(speed : Int) def breathe() = { println(& ...
- SQLite for xamarin
原文地址:http://www.codeproject.com/Articles/1097179/SQLite-with-Xamarin-Forms-Step-by-Step-guide SQLite ...
- 生产环境下,不建议用早期版本的Mono........
一个BUG修复需要4年!!!!!!!!!!!!!也是醉了....不造被微软收购后的Xamarin会不会好起来