06-装饰器模式
1.装饰器模式
public interface IPersonService {
void getName(String name);
}
public class PersonService implements IPersonService {
@Override
public void getName(String name) {
System.out.println("person name is " + name);
}
}
public class PersonServiceDecorator implements IPersonService {
private final IPersonService personService;
public PersonServiceDecorator(IPersonService personService) {
this.personService = personService;
}
@Override
public void getName(String name) {
// 装饰器模式对功能进行增加,姓名为当前类名 + 姓名。
String newName = this.getClass().getName() + name;
personService.getName(newName);
}
}
PersonServiceDecorator decorator = new PersonServiceDecorator(new PersonService());
decorator.getName("tom");
2.装饰器模式在Java中的应用-IO
FilterInputStream
类是IO中的核心类,用于增强InputStream
子类的功能。
- 通过装饰器模式可以给
FileInputStream
增加不同的功能。
FileInputStream fileInputStream = new FileInputStream("/test.sh");
// 给FileInputStream增加缓存的功能
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
// 给FileInputStream增加按照基本数据类型读取数据的功能
DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);
- Java中的IO使用装饰器模式对类的功能进行增强。同时避免了功能增强时类数量的指数级增长。
// 如果直接定义一个类来对FileInputStream进行增强。InputStream的子类是非常多个,
// 如果每个类添加缓冲功能时都通过定义一个类来完成,那么就会导致类的数量指数级增长。
// 所以使用装饰器模式通过组合的方式来为类添加缓存功能,只需要定义BufferedInputStream,
// 然后将需要增加缓冲功能的类通过BufferedInputStream的构造函数传入,就可以为其增加缓冲
// 功能。
BufferedFileInputStream bfis = new BufferedFileInputStream("/test.sh");
3.装饰器模式总结
- 装饰器模式和代理模式的异同点。
- 装饰器模式和代理模式的代码结构是很相似的,并且功能都是对原始类进行功能的增强。
- 装饰器模式和代理模式的区别是应用场景的不同,代理模式附加和原始类不相关的功能,装饰器模式附加与原始类相关的增强功能。
- 装饰器模式主要作用是给原始类添加增强功能。在实现上装饰器模式可以通过组合替代继承,来解决继承关系过于复杂的问题。
- 装饰器模式可以对原始类嵌套使用多个装饰器类。