一、什么是装饰设计模式
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的类成为装饰类。
装饰类通常会通过构造方法,传递进来一个需要装饰的对象,然后基于这个对象,提供更强大的方法。
下面是装饰设计模式的一个例子,自己写的MyBufferedReader,并提供了myReadLine方法,IO包中类BufferedReader采用原理也是类似的。
/*
装饰设计模式:MyBufferedReader
*/
importjava.io.*;
classMyBufferedReader
{
privateFileReaderfr;
MyBufferedReader(FileReaderfr)
{
this.fr=fr;
}
publicStringmyReadLine()throwsIOException
{
StringBuildersb=newStringBuilder();
intch;
while((ch=fr.read())!=-1)
{
if(ch=='\r')
continue;
elseif(ch=='\n')
returnsb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
returnsb.toString();
returnnull;
}
publicvoidmyClose()throwsIOException
{
fr.close();
}
}
classMyBufferedReaderDemo
{
publicstaticvoidmain(String[]args)throwsIOException
{
FileReaderfr=newFileReader("test.txt");
MyBufferedReaderbr=newMyBufferedReader(fr);
Stringline=null;
while((line=br.myReadLine())!=null)
{
System.out.println(line);
}
br.myClose();
}
}
 二、装饰和继承的区别
装饰设计模式比继承要灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能与已有对象是相同的,只不过提供了更强的功能。所以装饰类和被装饰类通常
是属于同一个体系的。
如下所示:
MyReaderMyReader
|--MyTextReader|--MyTextReader
|--MyBufferedTextReader|--MyMediaReader
|--MyMediaReader|--MyBufferedReader
|--MyBufferedMediaReader
如果为了改进一些功能而继承,就可能导致整个继承树过于臃肿,同时要考虑事物之间是否是父类和子类的关系。
  在IO包中,还有一个LineNumberReader,继承了BufferedReader,复用了其中功能(readLine),同时是FileReader的装饰类。如果想要获取所读文件中的行数,可以用这个装饰类,其中主要提供了了setLineNumber(),getLineNumber()方法。   
最新内容请见作者的GitHub页:http://qaseven.github.io/
   

黑马程序员:java基础之装饰设计模式相关推荐

  1. 黑马 程序员——Java基础---流程控制

    黑马程序员--Java基础---流程控制 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java提供了两种基本的流程控制结构:分支结构 ...

  2. 黑马 程序员——Java基础---IO(下)

    黑马程序员--Java基础---IO(下) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供 ...

  3. 黑马程序员-JAVA基础-IO流中的装饰设计模式

    ------- android培训.java培训.期待与您交流!------- 装饰设计模式: 当想要对已有的对象进行功能增强时,可以定义类,将已有的对象传入,基于已有的功能,并提供加强功能.那么,自 ...

  4. 黑马程序员-Java基础:设计模式总结

    --Java培训.Android培训.iOS培训..Net培训.期待与您交流! -- Java基础部分设计模式 一.设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的 ...

  5. 黑马程序员--Java基础加强篇

    开发工具使用 --------------------------------------------------------------------------------------------- ...

  6. 黑马程序员---java基础-Java之IO

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.概念 1.概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Jav ...

  7. 黑马程序员-Java基础:面向对象(上)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.面向对象概述 当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高.可随着需求的 ...

  8. 黑马程序员-Java基础知识预备之Java流程控制与数组

    -------- android培训.java培训.期待与您交流!---------- 本博文涉及的主要内容如下: if语句 switch语句 循环结构 循环结构的控制 数组类型 数组在内存中的运行机 ...

  9. 黑马程序员—java基础总结1

    ------- android培训.java培训.期待与您交流! ---------- 一:java概述: 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用 ...

  10. 黑马程序员 — JAVA基础 — 内部类、异常

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.内部类 1.概念: 把类定义在另一个类的内部,该类就被称为内部类. Eg:把 ...

最新文章

  1. float元素一定要闭合
  2. node.js中的字符串、对象和json处理函数
  3. Linux文本处理命令:cut grep awk sed printf
  4. js或css文件后面的参数是什么意思?
  5. java version 和javac版本不一致_解决linux下javac -version和java -version版本显示不一致...
  6. Citrix XenServer 6.5 发布
  7. MySQL 常见面试知识点
  8. 基于MODIS的锡林郭勒植被变化监测(附练习数据下载)
  9. mo java_mojava和 high sierra系统区别?
  10. jQuery计算时间差和阴阳历转换
  11. 虫虫 HTML5::初学者使用 Application Cache 指南
  12. 树莓派控制火焰传感器
  13. 计算机wps文字基础知识,计算机基础及WPS Office应用常见考试内容
  14. scala 读取txt文件(从文件读取)
  15. unity 输入框弹出输入法_国产输入法那么多,我为什么选择了「不接地气」的 Gboard?...
  16. 机智云物联网技术科普:一文看懂LoRa物联网!
  17. idea2020shezhi代码检查级别_GitLab 13.1:告警管理扩展,新代码质量工具和安全合规等...
  18. 第一届LeetCode刷题打卡赢现金活动开始啦,助力每一位想拿大厂offer的小伙伴!
  19. Dev C++的下载安装
  20. 2021浙江省ACM省赛后记

热门文章

  1. php代码冗余度检查插件,冗余代码检测与处理使用什么工具
  2. python随机生成车牌_使用Python自动化获取全国每个城市的车牌代码
  3. python123子字符串输出_Python--字符串函数方法全解
  4. 安装python缺少dll_解决Python安装时报缺少DLL问题【两种解决方法】
  5. 读取ppt并存入数据库_[导入]实时数据库理论与技术演讲PPT
  6. Zookeeper分布式一致性原理(十):Zookeeper在大型分布式系统的应用
  7. linux用file命令,Linux file命令的使用
  8. python win32console_python、unicode和windows控制台
  9. 锐捷ap怎么设置_WiFi又不稳定?怎么办,看这里
  10. python中类的嵌套_python中的嵌套类 | 学步园