裝飾者模式-IO流將大寫字母轉為小寫
阿新 • • 發佈:2018-12-21
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();*/ } }