一:摘要

  通过对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、扩展被装饰类的方法,在装饰类中实现自己想要的功能

    

根据IO流源码深入理解装饰设计模式使用的更多相关文章

  1. 从源码角度理解Java设计模式——装饰者模式

    一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...

  2. nodejs的tream(流)解析与模拟文件读写流源码实现

    什么是流? 可读流于可写流 双工流于转换流 背压机制与文件流模拟实现 一.什么是流? 关于流的概念早在1964年就有记录被提出了,简单的说"流"就是控制数据传输过程的程序,比如在那 ...

  3. java IO流的继承体系和装饰类应用

    java IO流的设计是基于装饰者模式&适配模式,面对IO流庞大的包装类体系,核心是要抓住其功能所对应的装饰类. 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的 ...

  4. storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解

    本文导读: 1 Worker.Executor.task详解 2 配置拓扑的并发度 3 拓扑示例 4 动态配置拓扑并发度 Worker.Executor.Task详解: Storm在集群上运行一个To ...

  5. React-setState源码的理解

    首先举一个最简单的例子: this.state={ a:1 } this.setState({ a:2 }) console.log(this.state.a)//1 可以说setState()操作是 ...

  6. 从源码上理解Netty并发工具-Promise

    前提 最近一直在看Netty相关的内容,也在编写一个轻量级的RPC框架来练手,途中发现了Netty的源码有很多亮点,某些实现甚至可以用苛刻来形容.另外,Netty提供的工具类也是相当优秀,可以开箱即用 ...

  7. 我对 impress.js 源码的理解

    源码看了两天,删掉了一些优化,和对 ipad 的支持,仅研究了其核心功能的实现,作以下记录. HTML 结构如下: <!doctype html> <html lang=" ...

  8. 从源码角度理解android动画Interpolator类的使用

    做过android动画的人对Interpolator应该不会陌生,这个类主要是用来控制android动画的执行速率,一般情况下,如果我们不设置,动画都不是匀速执行的,系统默认是先加速后减速这样一种动画 ...

  9. 关于spring的源码的理解

    从最基础的Hello World开始. spring的Hello World就三行代码: public void test() { ApplicationContext context = new C ...

随机推荐

  1. 序列化Json格式

    Json = JsonUtil.Serialize(new { code = 1, msg = "文件删除成功" }); public class JsonUtil     {   ...

  2. Axure RP一个专业的快速原型设计工具

    Axure RP是一个专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写. Axure简要介绍 Axur ...

  3. eclipse 修改默认的author

    1. 在eclipse.ini中添加 -vmargs -Duser.name={author name} 记得一定要在-vmargs之后,否则无效. 2. 设置eclipse参数 windows--& ...

  4. 摘抄--全面理解面向对象的 JavaScript

    全面理解面向对象的 JavaScript JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或 ...

  5. JavaScript设计模式(4)-桥接模式

    桥接模式 在设计一个 Js API 时,可用来弱化它与使用它的类和对象之间的耦合 1. 事件监听器的回调函数 function getBeerById(id, callback) { asyncReq ...

  6. es6中一些基本的使用方法

    es6中一些基本的使用方法 const 定义常量 let 块级变量 用let定义的变量只在块当中起作用,离开变量外界的块(括号)就会被销毁. 模板字面量 用于字符串拼接和写模板,使用 ` (反引号,左 ...

  7. 【NOIP2016】【CJOJ2257】2257 愤怒的小鸟

    题目 Description https://www.luogu.org/problem/show?pid=2831 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行 ...

  8. 【BZOJ3262】陌上花开(树套树)

    [BZOJ3262]陌上花开(树套树) 题面 对于权限题,我这种苦逼肯定是从别的OJ上搞的对不对??? CJOJ 洛谷 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味 ...

  9. [Luogu3768]简单的数学题

    题面戳我 题意:求 \[\sum_{i=1}^{n}\sum_{j=1}^{n}ij\gcd(i,j)\] \(n\le10^{10}\) sol \[ans=\sum_{d=1}^{n}d\sum_ ...

  10. NancyFX 第九章 Responses(响应对象)

    和内容协商最最为紧密的当属Nancy的Response对象. 在本书的第一张你应该就已经看到过Response对象,之前是使用它的AsFile 方法返回一个简单文件. using Nancy; nam ...