導語:Java是一門面向物件程式語言,不僅吸收了C++語言的各種優點,還摒棄了C++裡難以理解的多繼承、指標等概念,因此Java語言具有功能強大和簡單易用兩個特徵。下面我們來看看裝飾模式,希望對大家有所幫助。
裝飾模式(Decorator Pattern):
在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。
特點:
(1) 裝飾物件和真實物件有相同的介面。這樣客戶端物件就能以和真實物件相同的方式和裝飾物件互動
(2) 裝飾物件包含一個真實物件的引用(reference)
(3) 裝飾物件接受所有來自客戶端的請求。它把這些請求轉發給真實的物件。
(4) 裝飾物件可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在執行時,不用修改給定物件的結構就可以在外部增加附加的功能。在面向物件的設計中,通常是通過繼承來實現對給定類的功能擴充套件。
★ 場景和問題
在不對原有物件類進行修改的基礎上,如何給一個或多個已有的類物件提供增強額外的功能?
裝飾模式就可以實現該功能。同時繼承原有類,也能實現該功能
這裡模擬實現BufferReader中的readLine()方法,模擬一個帶快取的myRead()方法,對原有的read()方法進行增速
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 | package rator.v1; import Reader; import ception; 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 = (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== '' ){ continue ; } if (ch== '' ){ return ring(); } nd(( char )ch); } if (th()!= 0 ){ return ring(); } return null ; } public void myClose() throws IOException{ e(); } } |
12345 | ?sd2332uew wekjewkjewjk dfiuewi3223 ——————————Over---------- |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | package rator.v1; import eredReader; import InputStream; import NotFoundException; import Reader; import ception; import ; public class TestMyBufferedReader { ////////////1 測試對read()的增強////////////////////// @Test public void bufferedReaderDemo() throws Exception{ //javaAPI中的類 FileReader r = new FileReader( "" ); BufferedReader br = new BufferedReader(r); int ch= 0 ; while ( (ch=())!=- 1 ){ t(( char )ch); } e(); } /* 測試結果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ @Test public void myBufferedReaderDemo() throws Exception{ //我們自己寫的類 FileReader r = new FileReader( "" ); MyBufferedReader br = new MyBufferedReader(r); int ch= 0 ; while ( (ch=ad())!=- 1 ){ t(( char )ch); } ose(); } /* 測試結果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ ///////////2 測試對readLine()的增強///////////////////// @Test public void testBufferedReadLineDemo() throws IOException{ //javaAPI中的類 BufferedReader br = new BufferedReader( new FileReader( "" )); String str= null ; while ( (str=Line())!= null ){ tln(str); } e(); } /* 測試結果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ @Test public void testMyBufferedReadLineDemo() throws IOException{ //我們自己寫的類 MyBufferedReader br = new MyBufferedReader( new FileReader( "" )); String str= null ; while ( (str=adLine())!= null ){ tln(str); } ose(); } /* 測試結果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ } |