成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

設(shè)計(jì)模式(5)裝飾器模式(講解+應(yīng)用)

RebeccaZhong / 2453人閱讀

摘要:裝飾器模式在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。通過(guò)使用裝飾器模式,我們可以實(shí)現(xiàn)關(guān)閉原有代碼,開(kāi)放現(xiàn)有代碼的方式來(lái)實(shí)現(xiàn)更多的功能。

目錄

裝飾器模式

為什么使用裝飾器模式

應(yīng)用實(shí)例

裝飾器模式

看到裝飾器是在看《Thinking in Java》一書(shū)的時(shí)候,看到文件讀寫(xiě)那邊的時(shí)候,有提到裝飾器模式,同時(shí)在文件讀寫(xiě)的那一部分,對(duì)于各種讀入,寫(xiě)出的方式,代碼組織結(jié)構(gòu)感覺(jué)也是比較怪的,怪的總是吸引人的。

裝飾器模式:在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來(lái)包裹真實(shí)的對(duì)象。

通過(guò)使用裝飾器模式,我們可以實(shí)現(xiàn)關(guān)閉原有代碼,開(kāi)放現(xiàn)有代碼的方式來(lái)實(shí)現(xiàn)更多的功能。通過(guò)減少對(duì)原有代碼的改變,來(lái)降低犯錯(cuò)誤的幾率。不改變妹子的三圍,通過(guò)裝飾不同的制服,實(shí)現(xiàn)一個(gè)動(dòng)態(tài)擴(kuò)展,我們就會(huì)看到教師,護(hù)士,,,其本質(zhì)功能還是未改變的,只是體驗(yàn)更上一層樓。。。

為什么使用裝飾器模式

繼續(xù)上面的需求來(lái)舉例子吧,現(xiàn)在我們要針對(duì)該服務(wù)場(chǎng)所制定一個(gè)訂單系統(tǒng),當(dāng)客戶來(lái)選擇的時(shí)候,點(diǎn)一項(xiàng)服務(wù),我們需要向訂單中加入一項(xiàng),然后最后計(jì)算一個(gè)總和,由于young woman,student,nurse等基礎(chǔ)價(jià)格是不同的,假設(shè)在其基礎(chǔ)之上的單項(xiàng)服務(wù)價(jià)格是相同的,首先我們想到的可能是根據(jù)不同的類型繼承自一個(gè)基類,建立一個(gè)類,然后每個(gè)作為一個(gè)實(shí)例,將各項(xiàng)服務(wù)作為一個(gè)全局變量,然后各項(xiàng)服務(wù)有一個(gè)set方法,用來(lái)改變這些服務(wù)的狀態(tài),兩次調(diào)用可以取消該服務(wù),默認(rèn)各項(xiàng)服務(wù)的狀態(tài)是關(guān)閉的,然后最后通過(guò)一個(gè)cost方法判斷各種服務(wù)的來(lái)計(jì)算總價(jià)格,當(dāng)然感覺(jué)這是一個(gè)很不錯(cuò)的方法。但是由于某種服務(wù)的特殊性原因,能提供該服務(wù)的人減少,所以該服務(wù)價(jià)格上漲,或者是在某種服務(wù)在一個(gè)不小心中誕生,因此,我們需要打開(kāi)源代碼進(jìn)行添加一些服務(wù),然后需要添加set方法,同時(shí),我們需要對(duì)cost進(jìn)行修改,隨著人民思路不斷開(kāi)闊,冒險(xiǎn)精神日益增強(qiáng),各種服務(wù)如雨后春筍,我們的維護(hù)工作將變得比工作人員還要辛苦了。這個(gè)時(shí)候,就要引出我們的裝飾器模式,我們將所有需要付費(fèi)的拿出來(lái),因?yàn)槲覀冊(cè)诤笃诘木S護(hù)上,就是價(jià)格導(dǎo)致的變化給我們帶來(lái)了困擾,所以如果將這些變化的價(jià)格拿出來(lái),多帶帶維護(hù),我們的工作量將會(huì)減少。如下結(jié)構(gòu)

//基礎(chǔ)抽象類
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;
    }
}
//繼承自基礎(chǔ)類的用來(lái)修飾本體的類
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)建一個(gè)本體類,然后將其作為一個(gè)實(shí)例通過(guò)構(gòu)造函數(shù)注入到一個(gè)裝飾類,在裝飾類內(nèi)部通過(guò)委托的形式獲得當(dāng)前的價(jià)格和描述,同時(shí)由于本體類和裝飾類繼承自同一個(gè)基類,所以可以用來(lái)繼續(xù)向下傳遞。
基礎(chǔ)抽象類,通過(guò)構(gòu)造函數(shù)進(jìn)行實(shí)例注入,通過(guò)委托實(shí)現(xiàn)狀態(tài),數(shù)據(jù)更新,從而實(shí)現(xiàn)關(guān)閉原有代碼,開(kāi)放現(xiàn)有代碼。

應(yīng)用實(shí)例

言歸正傳,回到正題上來(lái),講一下其在我們平常開(kāi)發(fā)中的例子
開(kāi)始也提到了一點(diǎn)關(guān)于Java,io庫(kù)的問(wèn)題
java I/O庫(kù)具有兩個(gè)對(duì)稱性,它們分別是:

輸入-輸出對(duì)稱:比如InputStream 和OutputStream 各自占據(jù)Byte流的輸入和輸出的兩個(gè)平行的等級(jí)結(jié)構(gòu)的根部;而Reader和Writer各自占據(jù)Char流的輸入和輸出的兩個(gè)平行的等級(jí)結(jié)構(gòu)的根部。

byte-char對(duì)稱:InputStream和Reader的子類分別負(fù)責(zé)byte和Char流的輸入;OutputStream和Writer的子類分別負(fù)責(zé)byte和Char流的輸出

這些作為根類,如果我們想通過(guò)緩沖,字節(jié),或者是管道,這個(gè)時(shí)候我們就需要使用裝飾器來(lái)進(jìn)行裝飾,然后通過(guò)裝飾器來(lái)實(shí)現(xiàn)相應(yīng)的操作,根類具有read方法,對(duì)于裝飾類,通過(guò)構(gòu)造函數(shù)將基類的一個(gè)實(shí)例注入進(jìn)去,然后通過(guò)委托模式,首先通過(guò)基類的read方法獲取字節(jié)流,然后根據(jù)相應(yīng)的操作,實(shí)現(xiàn)字節(jié)讀取等。

InputStreamReader input = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(input);
String line = reader.readLine();

下篇更命令模式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64604.html

相關(guān)文章

  • 【用故事解讀 MobX 源碼(四)】裝飾 和 Enhancer

    摘要:所以這是一篇插隊(duì)的文章,用于去理解中的裝飾器和概念。因此,該的作用就是根據(jù)入?yún)⒎祷鼐唧w的描述符。其次局部來(lái)看,裝飾器具體應(yīng)用表達(dá)式是,其函數(shù)簽名和是一模一樣。等裝飾器語(yǔ)法,是和直接使用是等效等價(jià)的。 ================前言=================== 初衷:以系列故事的方式展現(xiàn) MobX 源碼邏輯,盡可能以易懂的方式講解源碼; 本系列文章: 《【用故事解...

    maybe_009 評(píng)論0 收藏0
  • 包裝模式就是這么簡(jiǎn)單啦

    摘要:包裝模式是這樣干的首先我們弄一個(gè)裝飾器,它實(shí)現(xiàn)了接口,以組合的方式接收我們的默認(rèn)實(shí)現(xiàn)類。其實(shí)裝飾器抽象類的作用就是代理核心的功能還是由最簡(jiǎn)單的實(shí)現(xiàn)類來(lái)做,只不過(guò)在擴(kuò)展的時(shí)候可以添加一些沒(méi)有的功能而已。 前言 只有光頭才能變強(qiáng) 回顧前面: 給女朋友講解什么是代理模式 前一篇已經(jīng)講解了代理模式了,今天要講解的就是裝飾模式啦~ 在看到FilterInputStream和FilterOutpu...

    Developer 評(píng)論0 收藏0
  • 【用故事解讀 MobX 源碼(五)】 Observable

    摘要:前言初衷以系列故事的方式展現(xiàn)源碼邏輯,盡可能以易懂的方式講解源碼本系列文章用故事解讀源碼一用故事解讀源碼二用故事解讀源碼三用故事解讀源碼四裝飾器和用故事解讀源碼五文章編排每篇文章分成兩大段,第一大段以簡(jiǎn)單的偵探系列故事的形式講解所涉及人物場(chǎng) ================前言=================== 初衷:以系列故事的方式展現(xiàn) MobX 源碼邏輯,盡可能以易懂的方式...

    leeon 評(píng)論0 收藏0
  • python設(shè)計(jì)模式-裝飾模式

    摘要:這種模式我們稱之為裝飾器模式。因?yàn)檠b飾器模式是在給對(duì)象增加責(zé)任。以下情況適合使用裝飾器模式在不影響其他對(duì)象的情況下,以動(dòng)態(tài)透明的方式給單個(gè)對(duì)象添加職責(zé)。 前言 本篇的裝飾器模式不是講解的python中的語(yǔ)法糖 @ 這個(gè)裝飾器。而是講解設(shè)計(jì)模式中的裝飾器模式。網(wǎng)上很多的實(shí)現(xiàn)都是基于java和c++的。本文則使用python來(lái)實(shí)現(xiàn),其中有些實(shí)現(xiàn)可能在python并不需要那樣來(lái)寫(xiě)的,但是思路...

    Yuqi 評(píng)論0 收藏0
  • 從ES6重新認(rèn)識(shí)JavaScript設(shè)計(jì)模式: 裝飾模式

    摘要:什么是裝飾器模式向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)的設(shè)計(jì)模式被稱為裝飾器模式,它是作為現(xiàn)有的類的一個(gè)包裝。中的裝飾器模式中有一個(gè)的提案,使用一個(gè)以開(kāi)頭的函數(shù)對(duì)中的及其屬性方法進(jìn)行修飾。 1 什么是裝飾器模式 showImg(https://segmentfault.com/img/remote/1460000015970102?w=1127&h=563); 向一個(gè)現(xiàn)有的對(duì)...

    wendux 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<