摘要:裝飾器模式在不必改變原類文件和使用繼承的情況下,動態(tài)地擴展一個對象的功能。通過使用裝飾器模式,我們可以實現(xiàn)關閉原有代碼,開放現(xiàn)有代碼的方式來實現(xiàn)更多的功能。
目錄
裝飾器模式
為什么使用裝飾器模式
應用實例
裝飾器模式看到裝飾器是在看《Thinking in Java》一書的時候,看到文件讀寫那邊的時候,有提到裝飾器模式,同時在文件讀寫的那一部分,對于各種讀入,寫出的方式,代碼組織結構感覺也是比較怪的,怪的總是吸引人的。
裝飾器模式:在不必改變原類文件和使用繼承的情況下,動態(tài)地擴展一個對象的功能。它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實的對象。
通過使用裝飾器模式,我們可以實現(xiàn)關閉原有代碼,開放現(xiàn)有代碼的方式來實現(xiàn)更多的功能。通過減少對原有代碼的改變,來降低犯錯誤的幾率。不改變妹子的三圍,通過裝飾不同的制服,實現(xiàn)一個動態(tài)擴展,我們就會看到教師,護士,,,其本質(zhì)功能還是未改變的,只是體驗更上一層樓。。。
為什么使用裝飾器模式繼續(xù)上面的需求來舉例子吧,現(xiàn)在我們要針對該服務場所制定一個訂單系統(tǒng),當客戶來選擇的時候,點一項服務,我們需要向訂單中加入一項,然后最后計算一個總和,由于young woman,student,nurse等基礎價格是不同的,假設在其基礎之上的單項服務價格是相同的,首先我們想到的可能是根據(jù)不同的類型繼承自一個基類,建立一個類,然后每個作為一個實例,將各項服務作為一個全局變量,然后各項服務有一個set方法,用來改變這些服務的狀態(tài),兩次調(diào)用可以取消該服務,默認各項服務的狀態(tài)是關閉的,然后最后通過一個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; } }
調(diào)用方式
Nurse sweetHeart = new Nurse(); sweetHeart = new PlayXiao(sweetHeart);
首先我們創(chuàng)建一個本體類,然后將其作為一個實例通過構造函數(shù)注入到一個裝飾類,在裝飾類內(nèi)部通過委托的形式獲得當前的價格和描述,同時由于本體類和裝飾類繼承自同一個基類,所以可以用來繼續(xù)向下傳遞。
基礎抽象類,通過構造函數(shù)進行實例注入,通過委托實現(xiàn)狀態(tài),數(shù)據(jù)更新,從而實現(xiàn)關閉原有代碼,開放現(xiàn)有代碼。
言歸正傳,回到正題上來,講一下其在我們平常開發(fā)中的例子
開始也提到了一點關于Java,io庫的問題
java I/O庫具有兩個對稱性,它們分別是:
輸入-輸出對稱:比如InputStream 和OutputStream 各自占據(jù)Byte流的輸入和輸出的兩個平行的等級結構的根部;而Reader和Writer各自占據(jù)Char流的輸入和輸出的兩個平行的等級結構的根部。
byte-char對稱:InputStream和Reader的子類分別負責byte和Char流的輸入;OutputStream和Writer的子類分別負責byte和Char流的輸出
這些作為根類,如果我們想通過緩沖,字節(jié),或者是管道,這個時候我們就需要使用裝飾器來進行裝飾,然后通過裝飾器來實現(xiàn)相應的操作,根類具有read方法,對于裝飾類,通過構造函數(shù)將基類的一個實例注入進去,然后通過委托模式,首先通過基類的read方法獲取字節(jié)流,然后根據(jù)相應的操作,實現(xiàn)字節(jié)讀取等。
InputStreamReader input = new InputStreamReader(System.in); BufferedReader reader = new BufferedReader(input); String line = reader.readLine();
下篇更命令模式
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64604.html
摘要:所以這是一篇插隊的文章,用于去理解中的裝飾器和概念。因此,該的作用就是根據(jù)入?yún)⒎祷鼐唧w的描述符。其次局部來看,裝飾器具體應用表達式是,其函數(shù)簽名和是一模一樣。等裝飾器語法,是和直接使用是等效等價的。 ================前言=================== 初衷:以系列故事的方式展現(xiàn) MobX 源碼邏輯,盡可能以易懂的方式講解源碼; 本系列文章: 《【用故事解...
摘要:包裝模式是這樣干的首先我們弄一個裝飾器,它實現(xiàn)了接口,以組合的方式接收我們的默認實現(xiàn)類。其實裝飾器抽象類的作用就是代理核心的功能還是由最簡單的實現(xiàn)類來做,只不過在擴展的時候可以添加一些沒有的功能而已。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 前一篇已經(jīng)講解了代理模式了,今天要講解的就是裝飾模式啦~ 在看到FilterInputStream和FilterOutpu...
摘要:前言初衷以系列故事的方式展現(xiàn)源碼邏輯,盡可能以易懂的方式講解源碼本系列文章用故事解讀源碼一用故事解讀源碼二用故事解讀源碼三用故事解讀源碼四裝飾器和用故事解讀源碼五文章編排每篇文章分成兩大段,第一大段以簡單的偵探系列故事的形式講解所涉及人物場 ================前言=================== 初衷:以系列故事的方式展現(xiàn) MobX 源碼邏輯,盡可能以易懂的方式...
摘要:這種模式我們稱之為裝飾器模式。因為裝飾器模式是在給對象增加責任。以下情況適合使用裝飾器模式在不影響其他對象的情況下,以動態(tài)透明的方式給單個對象添加職責。 前言 本篇的裝飾器模式不是講解的python中的語法糖 @ 這個裝飾器。而是講解設計模式中的裝飾器模式。網(wǎng)上很多的實現(xiàn)都是基于java和c++的。本文則使用python來實現(xiàn),其中有些實現(xiàn)可能在python并不需要那樣來寫的,但是思路...
摘要:什么是裝飾器模式向一個現(xiàn)有的對象添加新的功能,同時又不改變其結構的設計模式被稱為裝飾器模式,它是作為現(xiàn)有的類的一個包裝。中的裝飾器模式中有一個的提案,使用一個以開頭的函數(shù)對中的及其屬性方法進行修飾。 1 什么是裝飾器模式 showImg(https://segmentfault.com/img/remote/1460000015970102?w=1127&h=563); 向一個現(xiàn)有的對...
閱讀 3268·2021-11-15 11:37
閱讀 1074·2021-11-02 14:45
閱讀 3898·2021-09-04 16:48
閱讀 3575·2019-08-30 15:55
閱讀 753·2019-08-23 17:53
閱讀 999·2019-08-23 17:03
閱讀 2029·2019-08-23 16:43
閱讀 2188·2019-08-23 16:22