模式動機
- 完成一項任務凶硅,往往可以有多種不同的方式,每一種方式稱為一個策略,我們可以根據(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ū)別媚污,以便選擇合適的算法,這也是策略模式的缺點之一廷雅,在一定程度上增加了客戶端的使用難度耗美。
優(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)方式可以互換時使用策略模式。