Decorator模式

来源:互联网 发布:单片机编程工具 编辑:程序博客网 时间:2024/05/19 21:18

Decorator,装饰设计模式。这中模式中,我们搞清两个对象,一个装饰工(Decorator),另一个是被装饰者(Decoratee)。Decoratee本身有自己的各种属性和操作,只不过是这些操作还不够充足,还不能满足应用的需要;这时候,我们使用Decorator来补充之,提供一些额外的操作。简言之就是我们使用装饰者来动态地为一个对象增加一些额外的职责

同样,OO中的继承机制也使得我们可以在子类中扩展功能职责,那么Decorator还有存在的必要性吗?它的存在是因为它更灵活,更简洁。从java中io我们可以了解到,io的变种纷繁复杂,如果都用继承来完成的话,显然会相当繁杂;于是java的io就使用了这中模式来实现。

其类图关系:


其中Component是一个超类,ConcreteComponen是被装饰者,Decorator是装饰者,装饰者和被装饰者有共同的超类Component,但是此时我们发现Decorator和Component还有另外一条线,这条线表示Decorator还要组合Component。

从一个简单的例子理解Decorator。有一份工作是只想把墙壁刷成白色,很简单,我们首先创建这份工作:

public interface Work {
public void brush();
}

//创建刷墙的工作
public class BrushOnly implements Work {
public void brush() {
System.out.println("Do brushing with white");
}
}
这样我们就可以把墙壁刷成白色了:
Work brush = new BrushOnly();
brush.brush();

现在又想在墙刷完后,为它添加一些画,给原本白色的墙添加一点点装饰。于是我们开始给墙壁做装饰:

//为墙壁涂上画
public class Paint implements Work {
private Work work;
public Paint(Work work){
this.work = work;
}

public void brush() {
work.brush();
painting();
}

private void painting(){
System.out.println("Painting the wall after brushing");
}
}

这样我们就可以给白色的墙壁添上画了:

Work brush = new BrushOnly();
Work paint = new Paint(brush);
paint.brush();