一:摘要

  通过对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. Dshell----开源攻击分析框架

    前言 随着互联网的高速发展,网络安全问题变得至关重要,随着网络的不断规模化和复杂化,网络中拒绝服务(Denial of Service,DoS)攻击和分布式拒绝服务(Distributed Denia ...

  2. @SuppressWarnings("unchecked")(解决标准的后台HttpServletRequest request, HttpServletResponse response)格式

    在springmvc的应用中有些限制会出现必须是 public void save(HttpServletRequest request, HttpServletResponse response) ...

  3. controller层中,参数的获取方式以及作用域的问题

    package com.krry.web; import javax.servlet.http.HttpServletRequest; import org.springframework.stere ...

  4. Windows Developer Day - Windows AI Platform

    本次 Windows Developer Day,最值得期待的莫过于 Windows AI Platform 了,可以说是千呼万唤始出来.观看直播的开发者们,留言最多的也是 Windows AI Pl ...

  5. 【BZOJ1412】狼和羊的故事(网络流)

    [BZOJ1412]狼和羊的故事(网络流) 题面 Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听 ...

  6. 解决:安装oracle客户端,提示“oracle11g所选的主目录位于基目录外”

    安装oracle客户端,第三步下一步的时候,提示"oracle11g所选的主目录位于基目录外": 默认  Oracle基目录:D:\app\xxx 原      软件位置:F:\p ...

  7. 开发中使用mongoTemplate进行Aggregation聚合查询

    笔记:使用mongo聚合查询(一开始根本没接触过mongo,一点一点慢慢的查资料完成了工作需求) 需求:在订单表中,根据buyerNick分组,统计每个buyerNick的电话.地址.支付总金额以及总 ...

  8. Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference

    尝试在一个空的对象引用上引用boolean java.util.List.add()这个方法: 错误例子: private ArrayList<String> classList; cla ...

  9. LCA倍增算法

    LCA 算法是一个技巧性很强的算法. 十分感谢月老提供的模板. 这里我实现LCA是通过倍增,其实就是二进制优化. 任何一个数都可以有2的阶数实现 例如16可以由1 2 4 8组合得到 5可以由1 2 ...

  10. 用Node.js写爬虫,撸羞羞的图片

    说到爬虫,很多人都认为是很高大上的东西.哇塞,是不是可以爬妹纸图啊,是不是可以爬小片片啊.答案就是对的.爬虫可以完成这些东西的操作.但是,作为一个正直的程序员,我们要在法律允许范围内用爬虫来为我们服务 ...