1. 程式人生 > >裝飾者模式-IO流將大寫字母轉為小寫

裝飾者模式-IO流將大寫字母轉為小寫

1、意圖:

動態地給一個物件新增一些額外的職責。就增加功能來說, Decorator模式相比生成子類更為靈活。該模式以對客 戶端透明的方式擴充套件物件的功能。

2、適用環境

(1)在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責。

(2)處理那些可以撤消的職責。

(3)可能會產生大量的小類,增加系統的複雜性。 (4)採用裝飾模式的時候,例項化“元件”的時候,可能還選喲例項化“裝飾者”天曉得例項化多少個!你的程式碼就特別依賴這些裝飾類,從導致程式不容易維護,但是這個通過過工廠模式加以解解決!比如下面的例子,繼承了FilterInputStream,而這個類本身就有很多子類實現類,

3、參與者

    1.Component(被裝飾物件的基類)

      定義一個物件介面,可以給這些物件動態地新增職責。

    2.ConcreteComponent(具體被裝飾物件)

      定義一個物件,可以給這個物件新增一些職責。

    3.Decorator(裝飾者抽象類)

      維持一個指向Component例項的引用,並定義一個與Component介面一致的介面。

    4.ConcreteDecorator(具體裝飾者)

      具體的裝飾物件,給內部持有的具體被裝飾物件,增加具體的職責。

下面實現大寫轉換為小寫

import java.io.*;
public class Test extends FilterInputStream{

    protected Test(InputStream in) {
        super(in);
    }
    
    @Override
    public int read() throws IOException{
        int ch = super.read();
        if (ch >= 'A' && ch <= 'Z'){
            ch = Character.toLowerCase(ch);
        }
        return ch;
    }

    @Override
    public int read(byte[] b) throws IOException {
        int ch = super.read(b);
        for (int i=0;i<b.length;i++) {
            if (b[i] >= 'A' && b[i] <= 'Z'){
                b[i] = (byte)Character.toLowerCase(b[i]);
            }
        }
        return ch;
    }
    
    public static void main(String[] args) throws IOException {
        Test test = new Test(new FileInputStream("./data.txt"));
        int ch = 0;
        while ((ch = test.read()) != -1){
            System.out.print((char)ch);
        }
        test.close();
        /**一次性讀取一個字元陣列
        Test test = new Test(new FileInputStream(./data.txt"));
        byte[] bytes = new byte[1024];
        int len = 0;
        while((len = test.read(bytes))!= -1){
            String s = new String(bytes,0,len);
            System.out.print(s);
        }
        test.close();*/
    }
}