黑马程序员-JAVA学习之装饰设计模式与自定义BufferedReader
2014-10-08 17:28
651 查看
--------android培训、java培训、期待与你交流!--------
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有功能,并提供加强功能,其中该新定义的类称为装饰类,装饰类通常通过构造函数接收被装饰对象,并基于被装饰对象的功能,提供更强功能,
装饰模式与继承相比,装饰模式在类很多的时候,要比继承灵活,因为使用了组合方式,避免了继承体系的臃肿.
又因为装饰类的功能是来用增强已有对象,所以也具备与已有对象一样的功能,只不过是另外提供了额外的增强功能而已,所以一般装饰类了被装饰类通常都属于同一个继承体系中.
装饰设计模式特点可以用一句话来概括:"通过构造函数引入,进行功能增强"
下面由一个小例子大概演示一下装饰模式的原理
类Person中有一个吃饭的方法,只是简单的吃饭
类SuperPerson中通过构造函数引入Person对象,实现对吃饭功能的增强
当然,以上例子只是大概演示而已,并不是一个严格的装饰设计模式,但是已经把设计模式的样子大概做出来了
在JAVA的IO中的包装类就是装饰设计模式的一个具体的使用例子
下面请看一个自定义的MyBufferedReader类
BufferedReader里面的主要代码也差不多是这样的,只不过这里用的是StringBuilder,而JAVA的IO包里面的BufferedReader用的是数组而已,而且IO包里面的BufferedReader还继承了Reader,
但是并不影响我们对装饰设计模式的理解.当然,你可以直接查看BufferedReader的源代码,
BufferedReader类基于从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
通过接收一个Reader类,基于Reader类每次读取一个字符的方法,通过对这个功能的增强,实现一个每次读取一行的方法readLine();这样就可以每次读取一行字符串了.
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有功能,并提供加强功能,其中该新定义的类称为装饰类,装饰类通常通过构造函数接收被装饰对象,并基于被装饰对象的功能,提供更强功能,
装饰模式与继承相比,装饰模式在类很多的时候,要比继承灵活,因为使用了组合方式,避免了继承体系的臃肿.
又因为装饰类的功能是来用增强已有对象,所以也具备与已有对象一样的功能,只不过是另外提供了额外的增强功能而已,所以一般装饰类了被装饰类通常都属于同一个继承体系中.
装饰设计模式特点可以用一句话来概括:"通过构造函数引入,进行功能增强"
下面由一个小例子大概演示一下装饰模式的原理
// class Person { public void chiFan() { //吃饭 System.out.println("吃饭"); } } class SuperPerson { private Person person; public SuperPerson(Person _person) { this.person=_person; } public void superChiFan() { System.out.println("开胃菜"); this.person.chiFan();//原始功能 System.out.println("抽根烟"); } } class PersonDemo { public static void main(String[] args) { Person person=new Person(); SuperPerson sp=new SuperPerson(person); sp.superChiFan(); } } //
类Person中有一个吃饭的方法,只是简单的吃饭
类SuperPerson中通过构造函数引入Person对象,实现对吃饭功能的增强
当然,以上例子只是大概演示而已,并不是一个严格的装饰设计模式,但是已经把设计模式的样子大概做出来了
在JAVA的IO中的包装类就是装饰设计模式的一个具体的使用例子
下面请看一个自定义的MyBufferedReader类
// import java.io.*; class MyBufferedReader { private FileReader reader; public MyBufferedReader(FileReader _reader) { this.reader=_reader; } public String readLine()throws Exception { StringBuilder builder=new StringBuilder(); for(int data=0;(data=reader.read())!=-1;) { char c=(char)data; if(c=='\r'){continue;} if(c=='\n') { return builder.toString(); } else { builder.append(c); } } if(builder.length()>0) { return builder.toString(); } else { return null; } } public void close()throws Exception { this.reader.close(); } } class MyReaderDemo { public static void main(String[] args)throws Exception { MyBufferedReader br=new MyBufferedReader(new FileReader("test.txt")); for(String line="";(line=br.readLine())!=null;) { System.out.println(line); } br.close(); } } //
BufferedReader里面的主要代码也差不多是这样的,只不过这里用的是StringBuilder,而JAVA的IO包里面的BufferedReader用的是数组而已,而且IO包里面的BufferedReader还继承了Reader,
但是并不影响我们对装饰设计模式的理解.当然,你可以直接查看BufferedReader的源代码,
BufferedReader类基于从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
通过接收一个Reader类,基于Reader类每次读取一个字符的方法,通过对这个功能的增强,实现一个每次读取一行的方法readLine();这样就可以每次读取一行字符串了.
相关文章推荐
- 黑马程序员——学习Java基础之 io LineNumberReader 之装饰设计模式
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- 黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader
- 黑马程序员 java学习笔记3-IO流之字节流与装饰设计模式
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- javaseday21补充(装饰设计模式 BufferedReader 的小弟 LineNumber 行号媒体文件的复制)
- 黑马程序员-Java学习笔记之设计模式(单例设计模式,装饰设计模式,模板设计模式)
- 黑马程序员——Java基础——IO流、字符流、字节流、缓冲区技术、装饰设计模式、LineNumberReader等
- Java学习日志(19-2-IO流-装饰设计模式与LineNumberReader)
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- Java基础 - IO流之字符流,FileReader,FileWriter,BufferedReader,BufferedWriter,装饰设计模式,编码表
- 黑马程序员_java基础学习笔记之单例设计模式
- 8.2_java学习_装饰设计模式
- 黑马程序员_java的IO流(对第十九课字符缓冲区及装饰设计模式的总结)
- 黑马程序员_基础_IO流学习笔记_文本文件读取及复制、字符流的缓冲区和装饰设计模式
- IO流二:IO流之缓冲区BufferedReader、BufferedWriter、装饰设计模式、LineNumberReader
- 黑马程序员--Java学习11--设计模式
- 黑马程序员——Java学习笔记之12——已接触的“设计模式”总结