Decorator 模式动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。JAVA类库IO设计就采用Decorator 模式。
对于客户端来说,ConcreateComponent与Decorator的行为是一样的。可以在Decorator及子类中添加不同的行为。
源码如下:
public interface Work {
void insert();
}
实现类:
public class SimpleWork implements Work {
public void insert(){
System.out.println("simple insert");
}
}
装饰类:
public class DecoratorWork implements Work {
private Work work;
public DecoratorWork(Work work){
this.work = work;
}
public void insert() {
work.insert();
}
}
具体装饰类:
public class ConCreateDecorator extends DecoratorWork {
public ConCreateDecorator(Work work) {
super(work);
}
public void insert(){
insertB();
super.insert();
insertA();
}
public void insertB(){
System.out.println("B insert");
}
public void insertA(){
System.out.println("A insert");
}
}
测试类:
public class Test {
public static void main(String[] args) {
Work work = new SimpleWork();
Work work1 = new DecoratorWork(work);
work1.insert(); //---1
work.insert(); //---2 与1中输出结果一致
Work work2 = new ConCreateDecorator(work);
work2.insert();//添加了新的行为
}
}
结果为:
simple insert
simple insert
B insert
simple insert
A insert
在上例中不难发现,DecoratorWork 类实现了Work类,但是在DecoratorWork 类里又把Work类作为它的一个属性,这是为什么呢?
这是因为继承能使类型保持一致,而我们要灵活的使用类的行为则需要使用组合。
java.io包中就使用了些模式
我们可以继承FilterInputStream,并在自己的类中加入行为。装饰它