設(shè)計(jì)模式之裝飾者模式

設(shè)計(jì)模式之裝飾者模式

需求場(chǎng)景

咖啡店訂單系統(tǒng)

需求分析

咖啡種類(lèi)比較多茧球,結(jié)賬的時(shí)候我們需要知道咖啡名和價(jià)格谨读。首先想到的是我們創(chuàng)建一個(gè)咖啡的基類(lèi)号醉,該類(lèi)提供一個(gè)價(jià)格和名稱(chēng)的接口,店里的所有的飲料都繼承該類(lèi)蚂斤。

問(wèn)題

  • 我們給每種咖啡都要?jiǎng)?chuàng)建一個(gè)子類(lèi),一個(gè)咖啡店有很多種飲料槐沼,這樣就會(huì)創(chuàng)建很多的類(lèi)曙蒸,類(lèi)的數(shù)目過(guò)于龐大
  • 當(dāng)咖啡店不斷出新品的時(shí)候,系統(tǒng)不便于維護(hù)

分析

決定價(jià)格的因素:

  • 不同種類(lèi)的咖啡的價(jià)格不一樣
  • 咖啡里面的加入的調(diào)料的價(jià)格也不同

咖啡飲料的價(jià)格 = 咖啡的價(jià)格 + 加入調(diào)料的價(jià)格

由上邊可以看出:

咖啡相當(dāng)于‘被裝飾者’ 岗钩,調(diào)料相當(dāng)于’裝飾者‘
例如:
Espresso Macchiato(濃縮瑪奇朵 = Espresso(濃縮咖啡) +Milk(牛奶) + Mocha(摩卡)纽窟。

Espresso 相當(dāng)于”被裝飾者“ , Mocha和Milk相當(dāng)于‘裝飾者’

只要對(duì)被裝飾者和裝飾者進(jìn)行不同的組合兼吓,就可以得到不同的咖啡

這樣的組合是動(dòng)態(tài)的臂港,被裝飾者和裝飾者不是寫(xiě)死在類(lèi)里的比如繼承,類(lèi)繼承是在編譯的時(shí)候增加行為视搏,而裝飾者模式是在運(yùn)行時(shí)增加行為)审孽,而是動(dòng)態(tài)的組合,即在運(yùn)行時(shí)進(jìn)行綁定

設(shè)計(jì)結(jié)構(gòu)如下圖:

img

客點(diǎn)了一杯 Espresso Macchiato(濃縮瑪奇朵)浑娜,那么系統(tǒng)將會(huì)開(kāi)始以下的工作流程:

  • 首先實(shí)例化一個(gè)Espresso對(duì)象佑力,對(duì)象里面有名字和基本價(jià)格
  • 實(shí)例化一個(gè)milk的裝飾者對(duì)象,對(duì)象里面有名字和價(jià)格筋遭,同時(shí)讓milk持有Espresso
  • 調(diào)用milk的cost()方法打颤,這是會(huì)調(diào)用Espresso的cost方法,并把返回的價(jià)格和milk的價(jià)格相加漓滔。
  • 實(shí)例化一個(gè)Mocha的裝飾者對(duì)象编饺,對(duì)象里面有名字和價(jià)格,同時(shí)讓Mocha持有milk對(duì)象
  • 最后調(diào)用 Mocha 對(duì)象的 cost() 方法响驴,這個(gè)方法會(huì)去調(diào)用 Milk 對(duì)象的 cost() 方法透且,并將返回的價(jià)格和 mocha 的價(jià)格相加,如此我們就得到了 Espresso 配 milk 和 mocha 的價(jià)格豁鲤。

代碼實(shí)現(xiàn)

Beverage.h
#import <Foundation/Foundation.h>



@protocol Beverage <NSObject>

@optional


-(NSString *)getName;

-(double)cost;


@end

CondimentDecorator.h
#import <Foundation/Foundation.h>
#import "Beverage.h"

@protocol CondimentDecorator <Beverage>

@end

Espresso.h
#import <Foundation/Foundation.h>
#import "Beverage.h"
@interface Espresso : NSObject<Beverage>

@end

Espresso.m
#import "Espresso.h"

@implementation Espresso{

    NSString * _name;
}


-(instancetype)init{

    if(self = [super init]){
    
        _name = @"Espresso";
    }
    
    return self;
}

-(NSString *)getName{

    return _name;
}

-(double)cost{

    return 10.0;
}

@end

Milk.h
#import <Foundation/Foundation.h>
#import "Beverage.h"
#import "CondimentDecorator.h"

@interface Milk : NSObject<CondimentDecorator>

@property(nonatomic,retain) id<Beverage> Beverage;


-(instancetype)initWithBeverage:(id<Beverage>)beverage;

@end
Milk.m

#import "Milk.h"
#import "Beverage.h"


@implementation Milk{

    NSString * _name;
}


-(instancetype)initWithBeverage:(id<Beverage>)beverage{

    if(self = [super init]){
        
        _name = @"Milk";
    
        self.Beverage = beverage;
    
    }
    
    return self;
    
}


-(NSString *)getName{

    return [NSString stringWithFormat:@"%@ + %@",[self.Beverage getName],_name];
}

-(double)cost{

    return [self.Beverage cost] + 4.0;
}


@end

Mocha同Milk

調(diào)用

    Espresso * ex = [[Espresso alloc] init];
    
    NSLog(@"%@ %.2f",ex.getName,ex.cost);
    
    Milk * milk = [[Milk alloc] initWithBeverage:ex];
    
    NSLog(@"%@ %.2f",milk.getName,milk.cost);
    
    Mocha * mocha = [[Mocha alloc] initWithBeverage:milk];
    
    NSLog(@"%@ %.2f",mocha.getName,mocha.cost);

參考文章:
《HeadFirst設(shè)計(jì)模式》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末石蔗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子畅形,更是在濱河造成了極大的恐慌养距,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件日熬,死亡現(xiàn)場(chǎng)離奇詭異棍厌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)耘纱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敬肚,“玉大人,你說(shuō)我怎么就攤上這事束析⊙蘼” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵员寇,是天一觀的道長(zhǎng)弄慰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蝶锋,這世上最難降的妖魔是什么陆爽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮扳缕,結(jié)果婚禮上慌闭,老公的妹妹穿的比我還像新娘。我一直安慰自己躯舔,他們只是感情好驴剔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著粥庄,像睡著了一般仔拟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上飒赃,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天利花,我揣著相機(jī)與錄音,去河邊找鬼载佳。 笑死炒事,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔫慧。 我是一名探鬼主播挠乳,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姑躲!你這毒婦竟也來(lái)了睡扬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤黍析,失蹤者是張志新(化名)和其女友劉穎卖怜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體阐枣,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡马靠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年奄抽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甩鳄。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逞度,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妙啃,到底是詐尸還是另有隱情档泽,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布揖赴,位于F島的核電站馆匿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏储笑。R本人自食惡果不足惜甜熔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一圆恤、第九天 我趴在偏房一處隱蔽的房頂上張望突倍。 院中可真熱鬧,春花似錦盆昙、人聲如沸羽历。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秕磷。三九已至,卻和暖如春炼团,著一層夾襖步出監(jiān)牢的瞬間澎嚣,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工瘟芝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留易桃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓锌俱,卻偏偏與公主長(zhǎng)得像晤郑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贸宏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 裝飾者模式可以做到在不修改任何底層代碼的情況下造寝,給對(duì)象增加的新的方法。首先吭练,我們通過(guò)對(duì)一個(gè)現(xiàn)實(shí)問(wèn)題的模擬分析诫龙,了解...
    六尺帳篷閱讀 865評(píng)論 0 9
  • 引言 在介紹裝飾者模式之前,我們先了解一個(gè)設(shè)計(jì)原則: 多用組合鲫咽,少用繼承赐稽。 在平時(shí)寫(xiě)代碼時(shí)叫榕,我們應(yīng)該減少類(lèi)繼承的使...
    Zentopia閱讀 4,083評(píng)論 4 11
  • 定義 Decorator Pattern 在不改變接口的情況下,動(dòng)態(tài)的擴(kuò)展一個(gè)對(duì)象的功能姊舵。通過(guò)包裝對(duì)象來(lái)實(shí)現(xiàn)晰绎,又稱(chēng)...
    微微笑的蝸牛閱讀 893評(píng)論 0 49
  • 模擬需求 更新一個(gè)訂單系統(tǒng),以滿足飲料供應(yīng)要求括丁。原先的設(shè)計(jì)是這樣的 每種飲料都需要實(shí)現(xiàn)cost抽象方法荞下,來(lái)返回飲料...
    yaSecrets閱讀 223評(píng)論 0 0
  • 只有當(dāng)我們的工作超越熟練階段而成為自身的一種表達(dá)的時(shí)候尖昏,學(xué)習(xí)才成為一門(mén)真正的藝術(shù)。異類(lèi)中那些刻意練習(xí)1萬(wàn)個(gè)小時(shí)的頂...
    吳黃龍本人閱讀 270評(píng)論 0 0