Java设计模式之------装饰模式

装饰模式

装饰模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

例:写一个MyBufferedReader类,使它能够对字符流(如FileReader、InputStreamReader和PipedReader等)进行功能增强:

(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。

类体系对比:

Java设计模式之------装饰模式_第1张图片


<span style="font-size:14px;">import java.io.FileReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.io.PipedReader;  
import java.io.Reader;  
  
public class MyBufferedReader extends Reader{// ★  
    private Reader r;// 封装  ★  此处也可以使用FileReader或者PipedReader,此两者不需要继承,二Reader需要继承Reader
    private char[] buf = new char[1024];  
    private int count = 0;// 记录当前缓冲区中的字符个数  
    private int pos = 0;// 游标,数组下标,当前读取的是数组中的哪个元素  
  
    public MyBufferedReader(Reader r) { // ★  
        super();  
        this.r = r;  
    }  
  
    public int myRead() throws IOException {  
        // 当缓冲区为空时,用r对象到文件中去读取一组数据到缓冲区中  
        if (count <= 0) {  
            count = r.read(buf);  
            if (count < 0) {  
                return -1;  
            }  
            pos = 0;  
        }  
  
        // 从缓冲区中取一个字符出去  
        char ch = buf[pos];  
        pos++;  
        count--;  
        return ch;  
    }  
  
    public String myReadLine() throws IOException {  
        StringBuilder strBuild = new StringBuilder();  
        int ch = 0;  
        while ((ch = myRead()) != -1) {  
            if (ch == '\r') {// 回车  
                continue;  
            }  
            if (ch == '\n') {// 换行  
                return strBuild.toString();  
            }  
            strBuild.append((char)ch);  
        }  
        if (strBuild.length() != 0) {  
            return strBuild.toString();  
        }  
  
        return null;  
    }  
  
    public void MyClose() throws IOException {  
        r.close();  
    }  
  
    @Override  
    public int read(char[] cbuf, int off, int len) throws IOException {  
        return r.read(cbuf, off, len);  
    }  
  
    @Override  
    public void close() throws IOException {  
        r.close();  
    }  
      
}  </span>


你可能感兴趣的:(java,IO,java设计模式,装饰模式)