zoukankan      html  css  js  c++  java
  • 根据IO流源码深入理解装饰设计模式使用

    一:摘要

      通过对java的IO类中我们可以得出:IO源码中使用装饰设计模式频率非常高,

      对装饰设计模式而言,他能够避免继承体系的臃肿,同时也可以动态的给一个对象添加一些额外的功能,如果要扩展一个功能,装饰设计模式提供了比继承更具有弹性的设计方案,当然还有动态代理模式,三者都是对现有有的功能进行改造。

    二、案例:

      1、针对Reader这个类而言,我们可以看到使用的装饰设计模式之一是:

        BufferedReader br=new BufferedReader(new FileReader("c:\1.txt"));

      针对上行代码,我们可以看出BufferedReader是一个装饰类,将FileReader对象传入到装饰类中,可以提供在此基础上更加强大的功能。

      同时,我们也可以从源码中查看出:

        1、BufferedReader类继承了Reader类

        2、将Reader类作为参数,传入到BufferedReader类中的 构造方法中

        3、在此基础上实现自己想要的功能:例如readLine()方法

        

        

        

      2、针对InputStream这个类,我们同样也可以看到使用装饰设计模式的地方:

        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("c:\1.txt"));

         针对上行代码,我们可以看出BufferedInputStream是一个装饰类,将FileInputStream对象传入到装饰类中,可以提供在此基础上更加强大的功能。

        同时,我们也可以从源码中查看出:

          1、BufferedInputStream类继承了FilterInputStream

          2、将InputStream类作为参数,传入到BufferedInputStream类中的 构造方法中

          3、在此基础上实现自己想要的功能

    三、案例总结

      从上述源码案例中,我们可以看出一个实现装饰设计模式的大体流程

      1、首先定义一个接口或者抽象类作为被装饰类,例如:Reader类

      2、其次定义一个装饰类去继承或者实现被装饰类,同时将被装饰类作为参数传入到装饰类的构造方法中去

        例如:

        private Reader reader;

        public BufferedReader(Reader in) {
            this(in, defaultCharBufferSize);
        }

      3、扩展被装饰类的方法,在装饰类中实现自己想要的功能

        

  • 相关阅读:
    Integer中计算int位数的方法
    Spark学习---常见的RDD转和行动操作
    Spark学习---RDD编程
    《教父》中的经典台词以及英文原版
    关于MATSIM中,如何关闭自动加载dtd的问题
    源发行版8需要目标发行版1.8
    关于Mysql中GROUP_CONCAT函数返回值长度的坑
    【转】通过xml处理sql语句时对小于号与大于号的处理转换
    XmlDocument根据节点的属性值获取节点
    【转】使用SevenZipSharp压缩、解压文件
  • 原文地址:https://www.cnblogs.com/cczequn/p/8595428.html
Copyright © 2011-2022 走看看