概述
- 定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能
- 适用场景:
- 扩展一个类的功能
- 动态增加功能,动态撤销
实现
public interface ISubject {
void doSomeThing();
}
// 被装饰的类
public class ConcreteSubject implements ISubject {
@Override
public void doSomeThing() {
System.out.println("do something");
}
}
// 装饰器
public class Decorator implements ISubject {
private ISubject subject;
public Decorator(ISubject subject) {
this.subject = subject;
}
// 扩展doSomeThing()方法,使在执行原始doSomeThing()之前先执行think()方法
@Override
public void doSomeThing() {
think();
subject.doSomeThing();
}
public void think() {
System.out.println("thinking");
}
}
// 客户端
public class Client {
public static void main(String[] args) {
ISubject subject = new ConcreteSubject();
Decorator decorator = new Decorator(subject);
decorator.doSomeThing();
}
}
以上代码,通过装饰器模式使原始类拥有了“三思而后行”的功能,即在执行doSomeThing()方法执行会先执行think()方法
实际应用
java.io.FilterInputStream
InputStream ins = new FileInputStream("1.txt");
BufferedInputStream bin = new BufferedInputStream(ins);
上面的代码是不是很熟悉?对了,就是使用的装饰器模式,InputStream是被装饰的类,BufferedInputStream是装饰器,它为InputStream添加了数据缓冲的功能
对于其它的FilterInputStream的子类,其作用也是一样的,那就是装饰一个InputStream,为它添加它原本不具有的功能