設計模式-策略模式

模式動機

  • 完成一項任務凶硅,往往可以有多種不同的方式,每一種方式稱為一個策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的策略來完成該項任務;
  • 在軟件開發(fā)中也常常遇到類似的情況,實現(xiàn)某一個功能有多個途徑启昧,此時可以使用一種設計模式來使得系統(tǒng)可以靈活地選擇解決途徑,也能夠方便地增加新的解決途徑劈伴。

模式定義

策略模式(Strategy Pattern):策略模式是一種對象行為型模式箫津,它定義一系列算法,將每一個算法封裝起來,并讓它們可以相互替換苏遥。策略模式讓算法獨立于使用它的客戶而變化。

模式結(jié)構(gòu)

6A79C87C3FEE48A0F1CA96BC8605735C.png

代碼分析

- (instancetype)initWith:(LHCashType)type;
{
    self = [super init];
    if (self) {
        switch (type) {
            case LHCashTypeNormal: {
                _cs = [[CashNormal alloc] init];
            }
                break;
            case LHCashTypeRebate: {
                _cs = [[CashReturn alloc] initWith:@"300" moneyReturn:@"100"];
            }
                break;
            case LHCashTypeReturn: {
                _cs = [[CashRebate alloc] initWith:@"0.8"];
            }
                break;
        }
    }
    return self;
}

- (CGFloat)GetResult:(CGFloat)money {
    return [self.cs acceptCash:money];
}

模式分析

  • 策略模式是一個比較容易理解和使用的設計模式赡模,策略模式是對算法的封裝田炭,它把算法的責任和算法本身分割開,委派給不同的對象管理漓柑。策略模式通常把一個系列的算法封裝到一系列的策略類里面教硫,作為一個抽象策略類的子類。用一句話來說辆布,就是“準備一組算法瞬矩,并將每一個算法封裝起來,使得它們可以互換”锋玲;
  • 策略模式僅僅封裝算法景用,提供新算法插入到已有系統(tǒng)中,以及老算法從系統(tǒng)中“退休”的方便惭蹂,策略模式并不決定在何時使用何種算法伞插,算法的選擇由客戶端來決定。這在一定程度上提高了系統(tǒng)的靈活性盾碗,但是客戶端需要理解所有具體策略類之間的區(qū)別媚污,以便選擇合適的算法,這也是策略模式的缺點之一廷雅,在一定程度上增加了客戶端的使用難度耗美。

5.7. 實例

優(yōu)點

  • 提供了對“開閉原則”的完美支持,用戶可以在不修改原有系統(tǒng)的基礎上選擇算法或行為航缀,也可以靈活地增加新的算法或行為商架;
  • 策略模式提供了管理相關的算法族的辦法;
  • 策略模式提供了可以替換繼承關系的辦法谬盐;
  • 使用策略模式可以避免使用多重條件轉(zhuǎn)移語句甸私。

缺點

客戶端必須知道所有的策略類,并自行決定使用哪一個策略類,t同時將造成產(chǎn)生很多策略類飞傀,可以通過使用享元模式在一定程度上減少對象的數(shù)量皇型。

適用環(huán)境:

  • 如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為砸烦,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為弃鸦;
  • 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。
    如果一個對象有很多的行為幢痘,如果不用恰當?shù)哪J交8瘢@些行為就只好使用多重的條件選擇語句來實現(xiàn);
  • 不希望客戶端知道復雜的、與算法相關的數(shù)據(jù)結(jié)構(gòu)购岗,在具體策略類中封裝算法和相關的數(shù)據(jù)結(jié)構(gòu)汰聋,提高算法的保密性與安全性。

模式擴展

策略模式與狀態(tài)模式:
  • 可以通過環(huán)境類狀態(tài)的個數(shù)來決定是使用策略模式還是狀態(tài)模式喊积;
  • 策略模式的環(huán)境類自己選擇一個具體策略類烹困,具體策略類無須關心環(huán)境類;而狀態(tài)模式的環(huán)境類由于外在因素需要放進一個具體狀態(tài)中乾吻,以便通過其方法實現(xiàn)狀態(tài)的切換髓梅,因此環(huán)境類和狀態(tài)類之間存在一種雙向的關聯(lián)關系;
  • 使用策略模式時,客戶端需要知道所選的具體策略是哪一個绎签,而使用狀態(tài)模式時枯饿,客戶端無須關心具體狀態(tài),環(huán)境類的狀態(tài)會根據(jù)用戶的操作自動轉(zhuǎn)換诡必;
  • 如果系統(tǒng)中某個類的對象存在多種狀態(tài)奢方,不同狀態(tài)下行為有差異,而且這些狀態(tài)之間可以發(fā)生轉(zhuǎn)換時使用狀態(tài)模式擒权;如果系統(tǒng)中某個類的某一行為存在多種實現(xiàn)方式袱巨,而且這些實現(xiàn)方式可以互換時使用策略模式。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碳抄,一起剝皮案震驚了整個濱河市愉老,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剖效,老刑警劉巖嫉入,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異璧尸,居然都是意外死亡咒林,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門爷光,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垫竞,“玉大人,你說我怎么就攤上這事蛀序』兜桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵徐裸,是天一觀的道長遣鼓。 經(jīng)常有香客問我,道長重贺,這世上最難降的妖魔是什么骑祟? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任回懦,我火速辦了婚禮,結(jié)果婚禮上次企,老公的妹妹穿的比我還像新娘怯晕。我一直安慰自己,他們只是感情好抒巢,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布贫贝。 她就那樣靜靜地躺著,像睡著了一般蛉谜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崇堵,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天型诚,我揣著相機與錄音,去河邊找鬼鸳劳。 笑死狰贯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的赏廓。 我是一名探鬼主播涵紊,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼幔摸!你這毒婦竟也來了摸柄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤既忆,失蹤者是張志新(化名)和其女友劉穎驱负,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體患雇,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡跃脊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了苛吱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酪术。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖翠储,靈堂內(nèi)的尸體忽然破棺而出绘雁,到底是詐尸還是另有隱情,我是刑警寧澤彰亥,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布咧七,位于F島的核電站,受9級特大地震影響任斋,放射性物質(zhì)發(fā)生泄漏继阻。R本人自食惡果不足惜耻涛,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘟檩。 院中可真熱鬧抹缕,春花似錦、人聲如沸墨辛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睹簇。三九已至奏赘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間太惠,已是汗流浹背磨淌。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凿渊,地道東北人梁只。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像埃脏,于是被迫代替她去往敵國和親搪锣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是策略模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 策略模式和模板方法模式的區(qū)別 優(yōu)點和...
    w1992wishes閱讀 860評論 1 7
  • 概念及定義 概念在完成某一功能時彩掐,有時需要根據(jù)不同環(huán)境采取不同的策略或行為构舟。將這些不同的策略或行為(稱為算法)一一...
    maxwellyue閱讀 536評論 0 0
  • 定義 策略模式屬于對象的行為模式。其用意是針對一組算法佩谷,將每一個算法封裝到具有共同接口的獨立的類中旁壮,從而使得它們可...
    步積閱讀 767評論 0 2
  • 1、概念:策略模式定義了一系列的算法谐檀,并將每一個算法封裝起來抡谐,而且使它們還可以相互替換。策略模式讓算法獨立于使用它...
    小小布谷鳥閱讀 259評論 2 0
  • 外婆的味道 我是屬于外婆帶大的孩子中的一個桐猬。如今在我已不是一個孩子時卻倍加思念外婆麦撵,尤其是...
    繁華過往閱讀 327評論 1 2