一.装饰者设计模式简介

1.装饰者设计模式的概念:

装饰模式指的是在不改变原类文件和不使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。IO体系中用到了此设计模式

2.装饰者设计模式举例:

public class PersonDemo {public static void main(String[] args) {Person p = new Person();//将被包装类的对象传入包装类的对象NewPerson p1 = new NewPerson(p);//调用包装类的方法,此方法经过了包装类的扩展补充,同时还可以使用被包装类中此方法的功能p1.chifan();}//被包装类
class Person{void chifan(){System.out.println("吃饭");}
}//包装类
class NewPerson{private Person p ;NewPerson(Person p){this.p = p;}//对被包装类的方法进行了扩展,增加了新的功能,同时还兼顾了被包装类已经有的功能public void chifan(){System.out.println("开胃酒");p.chifan();System.out.println("甜点");}}

二.装饰者设计模式的在IO体系中的应用:

1.IO体系的分支体系Writer体系:

Writer
BufferedWriter
CharArrayWriter
StringWriter
PrintWriter

BufferedWriter就是一个包装类

2.BufferedWriter的构造方法:

方法 功能
BufferedWriter(Writer out) 创建一个使用默认输出缓冲区大小的缓冲字符输出流
BufferedWriter(Writer out, int sz) 创建一个使用给定输出缓冲区大小的新缓冲字符输出流

3.BufferedWriter部分源码:

public class BufferedWriter extends Writer {//构造函数,可以使用Write类的子类作为参数构造BufferedWriter类的对象public BufferedWriter(Writer out, int sz) {super(out);if (sz <= 0)throw new IllegalArgumentException("Buffer size <= 0");this.out = out;cb = new char[sz];nChars = sz;nextChar = 0;}//包装类BufferedWriter对被包装类(Write类的子类)的方法进行功能扩展,扩展之后write()方法既有被包装类(Write类的子类)的功能,也具备了使用缓冲区的能力public void write(char cbuf[], int off, int len) throws IOException {synchronized (lock) {ensureOpen();if ((off < 0) || (off > cbuf.length) || (len < 0) ||((off + len) > cbuf.length) || ((off + len) < 0)) {throw new IndexOutOfBoundsException();} else if (len == 0) {return;}if (len >= nChars) {flushBuffer();//调用了被包装类的write()方法,调用包装类的write()方法时还可以继续使用被包装类中该方法具有的功能out.write(cbuf, off, len);return;}int b = off, t = off + len;while (b < t) {int d = min(nChars - nextChar, t - b);System.arraycopy(cbuf, b, cb, nextChar, d);b += d;nextChar += d;if (nextChar >= nChars)flushBuffer();}}}

4.设计BufferedWriter包装类的目的:

通常情况下,对一个类进行功能扩展,会创建继承这个类的子类,在子类中进行功能扩展。

Writer
CharArrayWriter
StringWriter
PrintWriter

对于Writer体系,CharArrayWriter,StringWriter,PrintWriter是三个使用不同方式向硬件输出数据的类,现在需要对这三个类进行功能扩展,使其能够在输出数据时使用缓冲区。
一个可行的方案(也是最常用最容易想到的方案),是对每个写一个继承该类的子类,在子类中添加缓冲区功能,即BufferedCharArrayWriter,BufferedStringWriter,BufferedPrintWriter。但是,这个方案有缺陷,Writer体系的成员众多,为每一个类写一个子类添加缓冲区功能,会创建很多新的类,使得原本庞大的体系更臃肿,所以,需要一个不用创建很多新的类的方案。
如果用装饰者模式来解决这歌问题,效果会非常好,只用创建一个类作为包装类,即BufferedWriter类,当Writer体系中的类(目标类)需要使用缓冲区功能时,则使用BufferedWriter类的构造方法,将目标类的对象作为参数,创建BufferedWriter类的对象,然后调用BufferedWriter类中对目标类扩展的可以使用缓冲区的方法

5.BufferedWriter包装类的使用:

案例:使用缓冲区(IO-01-字节流与字符流有提及缓冲区的实现方式及优点)执行PrintWriter类的功能

public class Writer{public static void main(String[] args) {//创建被包装类的对象PrintWriter printWriter = new PrintWriter();//使用PrintWriter(被包装类)的对象构造扩展有缓冲区功能BufferedWriter(包装类),同时设置缓冲区的大小为8192(1024*8)BufferedWriter bufferedWriter = new BufferedWriter(printWriter,8192);//调用writer()方法,使用缓冲区执行PrintWriter类的writer()方法bufferedWriter.writer();}

Java设计模式-装饰者设计模式相关推荐

  1. 结构设计模式 - 装饰器设计模式

    结构设计模式 - 装饰设计模式 装饰器设计模式用于在运行时修改对象的功能.同时,同一类的其他实例不会受此影响,因此单个对象将获得已修改的行为.装饰器设计模式是结构设计模式之一(如Adapter Pat ...

  2. 学习笔记:设计模式-装饰器设计模式(JAVA)

    概念 装饰器设计模式,也叫包装设计模式,他是作为现有类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构. 给对象添加功能,一般两种方式,继承或者组合,将一个类的对象嵌入到另一个对象中, ...

  3. java学习--装饰器设计模式

    装饰器设计模式 例一:实现对声音的的放大功能 源码: package me.sgyz.study02;/***实现放大器对声音的的放大功能* @ 洛尘曦**/public class Decorate ...

  4. 装饰着模式示例_装饰器设计模式示例

    装饰着模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原 ...

  5. java设计模式之装饰模式_Java中的装饰器设计模式

    java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...

  6. Java中的装饰器设计模式

    装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模式的UML表示开始: Con ...

  7. java 设计模式 示例_Java示例中的装饰器设计模式

    java 设计模式 示例 Decorator design pattern is used to modify the functionality of an object at runtime. A ...

  8. 装饰者设计模式(java版本)

    引言 相信大家都在外面吃过烤鱼,我们吃烤鱼的时候是不是都会点一些配菜放到烤鱼里面一起加热煮熟着吃,那么这些配菜肯定是根据个人的爱好添加的,有的人喜欢海带.金针菇.有的人喜欢粉丝.青菜等等,这些配菜的价 ...

  9. Java进阶专题(八) 设计模式之适配器模式、装饰者模式、观察者模式

    本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式.本章节参考资料书籍<Spring ...

  10. 设计模式——装饰者模式

    本文是阅读 Head First 设计模式--装饰者模式的总结. 这本书的教学模式很不错,个人很喜欢,由实际的案例由浅入深,循序渐进的让你明白良好的设计是多么的优雅迷人(回头看看自己的代码,WTF!) ...

最新文章

  1. 从 12306 订购火车票 无需FQ
  2. 本人真实经历:面试了20家大厂之后,发现这样介绍项目经验,显得项目很牛逼!...
  3. c语言银行每月额外存款100,C语言课程设计_银行存取款业务.doc
  4. 嵌入式系统开发怎样快速度入门
  5. js 更改json的 key
  6. oracle 本年1月1号 yy,ORACLE 日期函数
  7. nginx 多个root_dockerfile定制自己的nginx
  8. python简单程序实例-python下10个简单实例代码
  9. Ms sql pivot unpivot
  10. ajax异步加载页面元素,使用jQuery的AJAX封装函数load()异步加载多个页面的相同页头/页尾(注意:js无法操作动态生成的网页元素)...
  11. CentOS6.5配置网络
  12. 如何打开caj文件?能转成PDF吗?
  13. Git clean简介
  14. 实验吧-PHP大法-eregi()函数
  15. 项目2:数据可视化(五)绘制世界人口地图
  16. DTAS棣拓智云-三维公差仿真模拟软件几何尺寸与公差分析软件-尺寸工程:DTAS Talk尺寸联盟参与公益课
  17. 黑客大神用什么杀毒? Windows 自带的就够, 只是加了亿点微小的强化
  18. 时间序列的分析及滚动预测代码
  19. 【Kibana】索引生命周期策略错误illegal_argument_exception: index.lifecycle.rollover_alias does not point to index
  20. 【技术分享】Win10 wampserver升级安装php7.2.32

热门文章

  1. 设备树与驱动的关系_9 Linux设备树的原理与应用实例(一)—— 什么是设备树...
  2. 15. Django基础:cookies和sesseion
  3. T5: Text-To-Text Transfer Transformer
  4. ValueError: Cannot feed value of shape (784,) for Tensor 'Placeholder:0', which has shape '(?, 784)'
  5. Linux的基本指令(2)-Linux从入门到精通第三天(非原创)
  6. java 之 插入排序
  7. caffe安装编译问题-ImportError: No module named caffe
  8. Angular2 的 View Encapsulation(样式封装)
  9. EJS脚本中MD5应用
  10. android 图片设置圆角