當前位置:才華齋>計算機>java語言>

java設計模式:裝飾模式

java語言 閱讀(9.5K)

導語:Java是一門面向物件程式語言,不僅吸收了C++語言的各種優點,還摒棄了C++裡難以理解的多繼承、指標等概念,因此Java語言具有功能強大和簡單易用兩個特徵。下面我們來看看裝飾模式,希望對大家有所幫助。

java設計模式:裝飾模式

  裝飾模式(Decorator Pattern):

在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。

  特點:

(1) 裝飾物件和真實物件有相同的介面。這樣客戶端物件就能以和真實物件相同的方式和裝飾物件互動

(2) 裝飾物件包含一個真實物件的引用(reference)

(3) 裝飾物件接受所有來自客戶端的請求。它把這些請求轉發給真實的物件。

(4) 裝飾物件可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在執行時,不用修改給定物件的結構就可以在外部增加附加的功能。在面向物件的設計中,通常是通過繼承來實現對給定類的功能擴充套件。

  ★ 場景和問題

在不對原有物件類進行修改的基礎上,如何給一個或多個已有的類物件提供增強額外的功能?

裝飾模式就可以實現該功能。同時繼承原有類,也能實現該功能

這裡模擬實現BufferReader中的readLine()方法,模擬一個帶快取的myRead()方法,對原有的read()方法進行增速

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758package 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----------

  測試

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687package 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---------- */ }