Java——裝飾設計模式

/*
裝飾設計模式:基於已經存在的功能,提供增強的功能

裝飾設計模式的由來:

Rreader
    ---TextReader
    ---MediaReader

提高子類的讀的效率

Reader
    ---TextReader
       ---BufferedTextReader
    ---MediaReader
       ---BufferedMediaReader
    ---OtherReader
       ---BufferedOtherReader

既然都是提高讀的效率,所以就把這個功能提取出來,封裝到一個類
中,誰需要被提高效率就把誰作爲參數傳遞給該類的構造方法

class BufferedReader{
    private Reader reader;

    public BufferedReader(Reader reader){
        this.reader = reader;
    }
}

使用裝飾設計模式後,繼承體系如下
Reader
    ---TextReader
    ---MediaReader
    ---OtherReader
    ---BufferedReader
1:裝飾設計模式使原有繼承體系變簡單了
2:因爲是在原有功能提供增強功能,所以這個類還屬於原體系

*/
/*import java.io.*;
class test{
    public static void main(String[] args)throws IOException{
        FileReader fr = new FileReader("temp.txt");

        LineNumberReader bnr = new LineNumberReader(fr);

        String line = null;

        bnr.setLineNumber(4);

        while((line = bnr.readLine())!=null){
            System.out.println(bnr.getLineNumber()+":"+line);
        }

        bnr.close();
    }
}*/

//自定義LineNumberReader
import java.io.*;
class MyLineNumberReader extends MyBufferedReader{
    private int lineNumber;

    public MyLineNumberReader(Reader r){
        super(r);
    }
    public void setLineNumber(int lineNumber){
        this.lineNumber = lineNumber;
    }
    public int getLineNumber(){
        return lineNumber;
    }
    //重寫一次讀一行的功能
    public String myReadLine()throws IOException{
        ++lineNumber;
        return super.myReadLine();
    }
}
//上篇中有介紹
class MyBufferedReader{
    private Reader r;//具備讀功能的成員
    private char[] arr = new char[1024];//提高效率的緩衝區
    private int index;
    private int count;//統計緩衝區中的字符個數

    public MyBufferedReader(Reader r){
        this.r = r;
    }

    //一次讀一個字符的功能
    public int myRead()throws IOException{
        //先判斷緩衝區中是否有字符
        if(count==0){
            //從文件中讀一批數據到緩衝區
            count = r.read(arr);
            index = 0;//下標置爲0,從頭開始取
        }
        if(count<0){
            return -1;
        }
        int num = arr[index];//從緩衝區中取一個字符
        count--;//數量-1
        index++;
        return num;
    }

    //一次讀一行的功能
    //反覆調用myRead()方法,不夠一行的時候存儲,夠一行的時候返回
    public String myReadLine()throws IOException{
        StringBuilder sb = new StringBuilder();//實現存儲字符
        int num;
        while((num=myRead())!=-1){
            if(num=='\r')
                continue;
            else if(num=='\n')
                return sb.toString();
            else 
                sb.append((char)num);
        }
        return null;
    }

    public void myClose()throws IOException{
        r.close();
    }
}
class test{
    public static void main(String[] args)throws IOException{
        FileReader fr = new FileReader("temp.txt");

        MyLineNumberReader mnr = new MyLineNumberReader(fr);

        String line = null;

        while((line = mnr.myReadLine())!=null){
            System.out.println(mnr.getLineNumber()+":"+line);
        }

        mnr.myClose();
    }
}
發佈了89 篇原創文章 · 獲贊 211 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章