zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ES6 generator生成器
    ES6 Class类(简单理解封装和继承)
    谷歌(chrome)浏览器下载文件另存为其它地址
    ES6 中的解构数组和对象
    获取数组中某一个元素的下标
    删除数组对象中某一个指定的对象
    jquery复选框全选功能
    正则获取字符串中的数字
    js刷新当前页面,刷新父页面
    找出最长序列的长度
  • 原文地址:https://www.cnblogs.com/hjy9420/p/5093048.html
Copyright © 2011-2022 走看看