装饰(Decorator)模式 属于设计模式里的结构模式,通过装饰类 动态的给一个对象添加一些额外的职责。装饰模式也叫包装( wrapper )模式。装饰模式有如下的角色:
抽象构件(component)角色 :这个角色用来规范被装饰的对象,一般用接口方式给出。
具体构件(concrete component )角色 :被装饰的类。
装饰(decorator)角色 :持有一个构件对象的实例。并定义一个跟抽象构件一直的接口。
具体 (concrete decorator ) 装饰角色 :负责给具体构件添加附加职责的类。在实际使用中多数情况下装饰角色和具体装饰角色可能由一个类来承担。
装饰模式的类图如下:
装饰模式的例子在生活中很常见,比如房子装修,那房子还是那个房子,只是在房子墙壁上做粉刷,贴墙纸,挂饰品等。java里面的io流,我们经常如下使用:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
这个就是装饰模式的使用。还有句话说人靠衣装,美靠靓装。这里就举个程序媛打扮自己的例子来说装饰模式。程序媛打扮自己的模型如下
![](http://img1.tuicool.com/2AZ3aq.png)
package decorator;
public interface 女人 {
public void 打扮();
}
package decorator;
public class 程序媛 implements 女人 {
@Override
public void 打扮() {
System.out.println("开始我是素颜。");
}
}
package decorator;
public class 化妆 implements 女人 {
private 女人 女人;
@Override
public void 打扮() {
女人.打扮();
}
}
package decorator;
public class 画眉 extends 化妆 {
private 女人 女人;
public 画眉(女人 女人) {
super();
this.女人 = 女人;
}
public void 打扮() {
System.out.println("画眉了,漂亮了一些。");
女人.打扮();
}
}
package decorator;
public class 刷睫毛 extends 化妆 {
private 女人 女人;
public 刷睫毛(女人 女人) {
super();
this.女人 = 女人;
}
public void 打扮() {
System.out.println("刷睫毛了,更漂亮了一些。");
女人.打扮();
}
}
package decorator;
public class 涂口红 extends 化妆 {
private 女人 女人;
public 涂口红(女人 女人) {
super();
this.女人 = 女人;
打扮();
}
public void 打扮() {
System.out.println("有了口红,哇塞,狐狸精一个!");
女人.打扮();
}
}
package decorator;
public class Client {
/**
*作者:alaric
*时间:2013-7-22下午10:57:13
*描述:测试
*/
public static void main(String[] args) {
女人 女1 = new 程序媛();
new 涂口红(new 刷睫毛(new 画眉(女1)));
}
}
运行结果:
有了口红,哇塞,狐狸精一个!
刷睫毛了,更漂亮了一些。
画眉了,漂亮了一些。
开始我是素颜。
通过上面例子我们可以看到,装饰模式在于在原有的功能上添加新的职责。装饰模式能够提供比继承更灵活的对象扩展能力,但是也往往由于这种灵活性会是系统调用变的复杂。