在java的IO中就是运用装饰模式设计的。一层装饰一层
如:DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("data.txt")));
装饰模式的组成:1、抽象构件角色:相当java.io中的OutputStream或者是InputStream
2、具体构件角色:相当于java.io中的FileInputStream或者是FileOutputStream
3、抽象装饰角色:持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口(即该角色继承或实现抽象构件角色)相当于java.io中的FilterInputStream或FilterOutputStream。
4、具体装饰角色:负责给构件对象添加附加功能。相当于java.io的BufferedInputStream或BufferedOutputStream。
代码实现如下:
/***定义抽象构件角色,并定义一个方法*/
public interfaceComponent {public voiddoSomething();
}
/*** 定义具体构件角色,实现方法*/
public class ConcreteComponent implementsComponent {
@Overridepublic voiddoSomething() {
System.out.println("FileInputStream");
}
}
/*** 定义抽象装饰角色,持有构件对象的引用,并定义一个与抽象构件接口一致的接口(即该角色继承或实现抽象构件角色)
*@authoracer
**/
public class Derector implementsComponent{privateComponent component;publicDerector(Component component){this.comonent =component;
}
@Overridepublic voiddoSomething() {
component.doSomething();
}
}
/*** 定义具体装饰角色,并添加附加功能
*@authoracer
**/
public class ConcreteDerector1 extendsDerector {publicConcreteDerector1(Compenent component) {super(component);
}
@Overridepublic voiddoSomething() {super.doSomething();
doAnything();
}public voiddoAnything(){
System.out.println("DataInputStream");
}
}
/*** 装饰模式,客户端测试
*
*@authoracer
**/
public classClient {public static voidmain(String[] args) {
Component component1= newConcreteComponent();
Component component2= new ConcreteDerector1(component1);//构建DataInputStream
component2.doSomething();
}
}
输出结果:
FileInputStream
DataInputStream