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

原文地址:https://www.cnblogs.com/hjy9420/p/5093048.html