在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 interface Component { public void doSomething(); }
/** * 定义具体构件角色,实现方法 */ public class ConcreteComponent implements Component { @Override public void doSomething() { System.out.println("FileInputStream"); } }
/** * 定义抽象装饰角色,持有构件对象的引用,并定义一个与抽象构件接口一致的接口(即该角色继承或实现抽象构件角色) * @author acer * */ public class Derector implements Component{ private Component component; public Derector(Component component){ this.comonent = component; } @Override public void doSomething() { component.doSomething(); } }
/** * 定义具体装饰角色,并添加附加功能 * @author acer * */ public class ConcreteDerector1 extends Derector { public ConcreteDerector1(Compenent component) { super(component); } @Override public void doSomething() { super.doSomething(); doAnything(); } public void doAnything(){ System.out.println("DataInputStream"); } }
/** * 装饰模式,客户端测试 * * @author acer * */ public class Client { public static void main(String[] args) { Component component1 = new ConcreteComponent(); Component component2 = new ConcreteDerector1(component1);//构建DataInputStream component2.doSomething(); } }
输出结果:
FileInputStream
DataInputStream
时间: 2024-10-12 22:05:17