- 相關推薦
java設計模式:裝飾模式
導語:Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。下面我們來看看裝飾模式,希望對大家有所幫助。
裝飾模式(Decorator Pattern):
在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
特點:
(1) 裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互
(2) 裝飾對象包含一個真實對象的引用(reference)
(3) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。
(4) 裝飾對象可以在轉發這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。
★ 場景和問題
在不對原有對象類進行修改的基礎上,如何給一個或多個已有的類對象提供增強額外的功能?
裝飾模式就可以實現該功能。同時繼承原有類,也能實現該功能
這里模擬實現BufferReader中的readLine()方法,模擬一個帶緩存的myRead()方法,對原有的read()方法進行增速
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package cn.hncu.pattern.decorator.v1; import java.io.FileReader; import java.io.IOException; 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 = r.read(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 sb.toString(); } sb.append((char)ch); } if(sb.length()!=0){ return sb.toString(); } return null; } public void myClose() throws IOException{ r.close(); } } |
a.txt
1 2 3 4 5 | ?sd2332uew wekjewkjewjk dfiuewi3223 ——————————Over---------- |
測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | package cn.hncu.pattern.decorator.v1; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import org.junit.Test; public class TestMyBufferedReader { ////////////1 測試對read()的增強////////////////////// @Test public void bufferedReaderDemo() throws Exception{ //javaAPI中的類 FileReader r = new FileReader("a.txt"); BufferedReader br = new BufferedReader(r); int ch=0; while( (ch=br.read())!=-1){ System.out.print((char)ch); } br.close(); } /* 測試結果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ @Test public void myBufferedReaderDemo() throws Exception{ //我們自己寫的類 FileReader r = new FileReader("a.txt"); MyBufferedReader br = new MyBufferedReader(r); int ch=0; while( (ch=br.myRead())!=-1){ System.out.print((char)ch); } br.myClose(); } /* 測試結果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ ///////////2 測試對readLine()的增強///////////////////// @Test public void testBufferedReadLineDemo() throws IOException{ //javaAPI中的類 BufferedReader br =new BufferedReader( new FileReader("a.txt")); String str=null; while( (str=br.readLine())!=null ){ System.out.println(str); } br.close(); } /* 測試結果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ @Test public void testMyBufferedReadLineDemo() throws IOException{ //我們自己寫的類 MyBufferedReader br =new MyBufferedReader( new FileReader("a.txt")); String str=null; while( (str=br.myReadLine())!=null ){ System.out.println(str); } br.myClose(); } /* 測試結果: * ?sd2332uew * wekjewkjewjk * dfiuewi3223 * * ——————————Over---------- */ } |
【java設計模式:裝飾模式】相關文章:
java設計模式:多例模式08-12
java設計模式:工廠模式05-27
java設計模式:DAO模式03-13
JAVA設計模式之單例模式07-29
Java單例設計模式04-25
Java的設計模式編程中責任鏈模式的運用的實例講解07-07
Java的結構型模式07-09