装饰器模式(讲解+应用)
轉載自?設計模式(5)裝飾器模式(講解+應用)
目錄
裝飾器模式
為什么使用裝飾器模式
應用實例
裝飾器模式
看到裝飾器是在看《Thinking in Java》一書的時候,看到文件讀寫那邊的時候,有提到裝飾器模式,同時在文件讀寫的那一部分,對于各種讀入,寫出的方式,代碼組織結構感覺也是比較怪的,怪的總是吸引人的。
裝飾器模式:在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
通過使用裝飾器模式,我們可以實現關閉原有代碼,開放現有代碼的方式來實現更多的功能。通過減少對原有代碼的改變,來降低犯錯誤的幾率。不改變妹子的三圍,通過裝飾不同的制服,實現一個動態擴展,我們就會看到教師,護士,,,其本質功能還是未改變的,只是體驗更上一層樓。。。
為什么使用裝飾器模式
繼續上面的需求來舉例子吧,現在我們要針對該服務場所制定一個訂單系統,當客戶來選擇的時候,點一項服務,我們需要向訂單中加入一項,然后最后計算一個總和,由于young woman,student,nurse等基礎價格是不同的,假設在其基礎之上的單項服務價格是相同的,首先我們想到的可能是根據不同的類型繼承自一個基類,建立一個類,然后每個作為一個實例,將各項服務作為一個全局變量,然后各項服務有一個set方法,用來改變這些服務的狀態,兩次調用可以取消該服務,默認各項服務的狀態是關閉的,然后最后通過一個cost方法判斷各種服務的來計算總價格,當然感覺這是一個很不錯的方法。但是由于某種服務的特殊性原因,能提供該服務的人減少,所以該服務價格上漲,或者是在某種服務在一個不小心中誕生,因此,我們需要打開源代碼進行添加一些服務,然后需要添加set方法,同時,我們需要對cost進行修改,隨著人民思路不斷開闊,冒險精神日益增強,各種服務如雨后春筍,我們的維護工作將變得比工作人員還要辛苦了。這個時候,就要引出我們的裝飾器模式,我們將所有需要付費的拿出來,因為我們在后期的維護上,就是價格導致的變化給我們帶來了困擾,所以如果將這些變化的價格拿出來,單獨維護,我們的工作量將會減少。如下結構
//基礎抽象類 public abstract class SexService{String description = "Best Service";public String getDescription(){return description;}public abstract int cost(); } //繼承自抽象類的本體 public class Nurse extends SexService{public Nurse(){description = "You konw";}public int cost(){return 150;} } //繼承自基礎類的用來修飾本體的類 public class PlayXiao extends SexService{SexService service;public PlayXiao(SexService service){this.service = service;}public String getDescription(){return service.getDescription+"PlayXiao";}public int cost(){return service.cost+50;}}調用方式
Nurse sweetHeart = new Nurse(); sweetHeart = new PlayXiao(sweetHeart);首先我們創建一個本體類,然后將其作為一個實例通過構造函數注入到一個裝飾類,在裝飾類內部通過委托的形式獲得當前的價格和描述,同時由于本體類和裝飾類繼承自同一個基類,所以可以用來繼續向下傳遞。
基礎抽象類,通過構造函數進行實例注入,通過委托實現狀態,數據更新,從而實現關閉原有代碼,開放現有代碼。
應用實例
言歸正傳,回到正題上來,講一下其在我們平常開發中的例子
開始也提到了一點關于Java,io庫的問題
java I/O庫具有兩個對稱性,它們分別是:
輸入-輸出對稱:比如InputStream 和OutputStream 各自占據Byte流的輸入和輸出的兩個平行的等級結構的根部;而Reader和Writer各自占據Char流的輸入和輸出的兩個平行的等級結構的根部。
byte-char對稱:InputStream和Reader的子類分別負責byte和Char流的輸入;OutputStream和Writer的子類分別負責byte和Char流的輸出
這些作為根類,如果我們想通過緩沖,字節,或者是管道,這個時候我們就需要使用裝飾器來進行裝飾,然后通過裝飾器來實現相應的操作,根類具有read方法,對于裝飾類,通過構造函數將基類的一個實例注入進去,然后通過委托模式,首先通過基類的read方法獲取字節流,然后根據相應的操作,實現字節讀取等。
InputStreamReader input = new InputStreamReader(System.in); BufferedReader reader = new BufferedReader(input); String line = reader.readLine();總結
以上是生活随笔為你收集整理的装饰器模式(讲解+应用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦幻西游对电脑的要求是不是很低?
- 下一篇: 组合模式的安全模式与透明模式