java設計模式:裝飾模式
導語:Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。下面我們來看看裝飾模式,希望對大家有所幫助。
裝飾模式(Decorator Pattern):
在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
特點:
(1) 裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互
(2) 裝飾對象包含一個真實對象的引用(reference)
(3) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。
(4) 裝飾對象可以在轉發這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。
★ 場景和問題
在不對原有對象類進行修改的基礎上,如何給一個或多個已有的類對象提供增強額外的功能?
裝飾模式就可以實現該功能。同時繼承原有類,也能實現該功能
這里模擬實現BufferReader中的readLine()方法,模擬一個帶緩存的.myRead()方法,對原有的read()方法進行增速
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758package 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
12345?sd2332uew wekjewkjewjk dfiuewi3223 ——————————Over----------測試
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687package 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設計模式之單例模式11-23
解析Java的設計模式編程之解釋器模式的運用11-23
Java的設計模式編程中責任鏈模式的運用的實例講解12-01
該怎么使用Java設計模式編程中的OCP開閉原則?11-23
簡單講解Java的Future編程模式方案11-25
Java開發策略模式的簡單應用實現方法11-30
PHP中的設計模式詳解08-15
C語言編程中使用設計模式中的原型模式的講解11-19
photoshop柔光模式和疊加模式的運用教程11-15
海關通關作業新模式11-12