java设计模式--装饰模式
2017-08-08 19:58
295 查看
装饰模式
装饰模式(Decorator Pattern):
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
特点:
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
★ 场景和问题
在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能?
装饰模式就可以实现该功能。同时继承原有类,也能实现该功能
这里模拟实现BufferReader中的readLine()方法,模拟一个带缓存的myRead()方法,对原有的read()方法进行增速
package cn.hncu.pattern.decorator.v1; import java.io.FileReader; import java.io.IOException; public class MyBufferedReader { private FileReader r; //封装一个对象 private char[] cbuf = new char[1024]; private int count=0; //记录当前缓冲区中字符的个数 private int pos=0; //数组元素的下标(当前读取的位置) public MyBufferedReader(FileReader r ){ this.r = r; } public int myRead() throws IOException { //对read()方法的功能加强 if(count<=0){ count = r.read(cbuf); if(count==-1){ return -1;//代表读取到文件末尾 } pos=0; } char ch = cbuf[pos]; count--; pos++; return ch; } public String myReadLine() throws IOException{ //模拟readLine()方法 StringBuilder sb = new StringBuilder(); int ch=0; while( (ch=myRead())!=-1 ){ if(ch=='\r'){ continue; } if(ch=='\n'){ return sb.toString(); } sb.append((char)ch); } if(sb.length()!=0){ return sb.toString(); } return null; } public void myClose() throws IOException{ r.close(); } }a.txt
sd2332uew wekjewkjewjk dfiuewi3223 ——————————Over----------测试
package cn.hncu.pattern.decorator.v1; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import org.junit.Test; public class TestMyBufferedReader { ////////////1 测试对read()的增强////////////////////// @Test public void bufferedReaderDemo() throws Exception{ //javaAPI中的类 FileReader r = new FileReader("a.txt"); BufferedReader br = new BufferedReader(r); int ch=0; while( (ch=br.read())!=-1){ System.out.print((char)ch); } br.close(); } /* 测试结果: * sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ @Test public void myBufferedReaderDemo() throws Exception{ //我们自己写的类 FileReader r = new FileReader("a.txt"); MyBufferedReader br = new MyBufferedReader(r); int ch=0; while( (ch=br.myRead())!=-1){ System.out.print((char)ch); } br.myClose(); } /* 测试结果: * sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ ///////////2 测试对readLine()的增强///////////////////// @Test public void testBufferedReadLineDemo() throws IOException{ //javaAPI中的类 BufferedReader br =new BufferedReader( new FileReader("a.txt")); String str=null; while( (str=br.readLine())!=null ){ System.out.println(str); } br.close(); } /* 测试结果: * sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ @Test public void testMyBufferedReadLineDemo() throws IOException{ //我们自己写的类 MyBufferedReader br =new MyBufferedReader( new FileReader("a.txt")); String str=null; while( (str=br.myReadLine())!=null ){ System.out.println(str); } br.myClose(); } /* 测试结果: * sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ }
相关文章推荐
- java设计模式之装饰模式
- Java_基础—装饰设计模式
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
- Java设计模式之装饰器模式简单介绍
- java设计模式4.适配器模式、装饰器模式
- (三)Java设计模式--装饰器模式
- Java设计模式学习09——装饰模式
- JAVA设计模式--装饰模式
- Java——设计模式(装饰模式_IO)
- Java设计模式—装饰模式
- java IO包 与 装饰设计模式 浅谈
- Java设计模式十九:装饰模式(Decorator Pattern)
- JAVA 装饰类(装饰设计模式)
- java设计模式-装饰模式
- Java基础之IO流,装饰设计模式的应用之行号、缓冲读取文本文件
- java设计模式-装饰器
- Java语言实现的装饰设计模式复习
- Java设计模式学习记录-装饰模式
- 15.Java基础:设计模式----->装饰模式
- java 设计模式之装饰模式