目录
- 简介
- 包含角色
- UML类图
- java实现
- 使用场景
- 优缺点
1. 简介
以对客户端透明得方式扩展对象得功能,换言之,客户端不会觉得对象在装饰前和装饰后有什么不同,是继承关系得一个替代方案,在IO流中由大量运用
2. 包含角色
2.1 抽象构件角色
给出一个接口,用以规范准备接收附加责任的对象
2.2 具体构件角色
定义一个将要接收附加责任的类
2.3 扩展功能角色
需要扩展的功能接口
2.4 具体装饰角色
负责给构建对象贴上附加的责任,持有构建对象的实例
3. UML类图
4. java实现
模拟(DataInputStream,FileInputStream,DataInput,InputStream)
4.1 抽象构件角色
/**
* @program: pattern
* @description: 抽象构建角色
* @author: chengqj
* @create: 2018-08-03 09:27
**/
public interface InputStream {
int read();
}
4.2 具体构件角色
/**
* @program: pattern
* @description: 具体构建角色
* @author: chengqj
* @create: 2018-08-03 09:27
**/
public class FileInputStream implements InputStream{
@Override
public int read() {
System.out.println("FileInputStream 进行read");
return 0;
}
}
4.3 扩展功能角色
/**
* @program: pattern
* @description: 扩展内容
* @author: chengqj
* @create: 2018-08-03 09:32
**/
public interface DataInput {
String readLine() throws IOException;
}
4.4 具体装饰角色
/**
* @program: pattern
* @description: 具体装饰角色
* @author: chengqj
* @create: 2018-08-03 09:32
**/
public class DataInputStream extends FileInputStream implements DataInput{
public InputStream inputStream;
public DataInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public int read() {
System.out.println("扩展部分功能");
return inputStream.read();
}
@Override
public String readLine() throws IOException {
System.out.println("读取行信息");
return null;
}
}
5. 适用场景:
- 需要扩展一个类的功能,或给一个类添加附加责任
- 需要动态的给一个对象增加功能,这些功能可以再动态的撤销
- 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实
6. 优缺点:
6.1 优点:
- 装饰模式与继承关系的目的都市要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活
- 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合
6.2 缺点:
- 继承更加灵活机动的特性,也同事意味着装饰模式比继承更加易于出错
- 装饰模式会产生比使用继承关系更多的对象,更多的对象会使得查错变得困难,特别是这些对象看上去都很相像