java装饰模式

时间:2023-03-09 22:08:21
java装饰模式

在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