策略模式:定義一系列的算法,把它們一個(gè)個(gè)封裝起來, 并且使它們可相互替換。
現(xiàn)在我們來定義一個(gè)計(jì)算器,加減乘除四個(gè)功能:
import UIKit
protocol StrategyProtocol {
func calculation(a: Double, b: Double) -> Double
}
//加
class SumStrategy: StrategyProtocol {
func calculation(a: Double, b: Double) -> Double {
return a + b
}
}
//減
class ReduceStrategy: StrategyProtocol {
func calculation(a: Double, b: Double) -> Double {
return a - b
}
}
//乘
class MultiplyStrategy: StrategyProtocol {
func calculation(a: Double, b: Double) -> Double {
return a * b
}
}
//除
class DivideStrategy: StrategyProtocol {
func calculation(a: Double, b: Double) -> Double {
return a / b
}
}
然后我們來個(gè)管理類,來執(zhí)行這些算法,并且可以在外部切換算法:
import UIKit
class StrategyContext: NSObject {
var strategy: StrategyProtocol!
//返回自己,方便鏈?zhǔn)秸{(diào)用
func setStrategy(strategy: StrategyProtocol) -> StrategyContext{
self.strategy = strategy
return self
}
func executeStrategy(a: Double, b: Double) -> Double {
return self.strategy.calculation(a: a, b: b)
}
}
最后在調(diào)用的時(shí)候,我們需要知道自己想要的策略算法,傳遞給管理類,這樣才能得到計(jì)算結(jié)果:
let context = StrategyContext()
let result1 = context.setStrategy(strategy: SumStrategy()).executeStrategy(a: 20, b: 30)
print(result1)
let result2 = context.setStrategy(strategy: ReduceStrategy()).executeStrategy(a: 20, b: 30)
print(result2)
let result3 = context.setStrategy(strategy: MultiplyStrategy()).executeStrategy(a: 20, b: 30)
print(result3)
let result4 = context.setStrategy(strategy: DivideStrategy()).executeStrategy(a: 20, b: 30)
print(result4)
打印結(jié)果:
50.0
-10.0
600.0
0.6666666666666666
如此簡單的功能,設(shè)計(jì)的這么復(fù)雜,有什么好處呢?假如這里我們要加上一個(gè)取模的算法,只需再寫一個(gè)類,實(shí)現(xiàn)策略接口,就可以在外部直接調(diào)用了。
再舉一個(gè)例子:

高德地圖查詢某個(gè)地點(diǎn)時(shí),出來的路線有很多種,騎車、駕車、步行、公交等各種出行策略,每種策略又有好幾條路線,如果全部都耦合到一個(gè)類里,此類將會(huì)非常復(fù)雜,這時(shí)候我們可以定義一個(gè)策略接口,由策略類分別執(zhí)行路線規(guī)劃,然后定義一個(gè)管理類Context來切換不同的策略,當(dāng)用戶點(diǎn)擊選擇不同的出行方式時(shí),由Context來執(zhí)行出行策略,給出路線規(guī)劃。
上次面試遇到一個(gè)問題,一個(gè)商品可能會(huì)有很多優(yōu)惠方式,優(yōu)惠券啊,打折啊,滿減啊,買五送一啊,還可能會(huì)有各種優(yōu)惠方式疊加,這個(gè)時(shí)候如果寫在一個(gè)類里,通過if else來區(qū)分,這個(gè)類很快就會(huì)不能維護(hù),這個(gè)時(shí)候就可以用策略模式,不論后期添加什么活動(dòng),都可以通過增加一個(gè)類來實(shí)現(xiàn),符合開閉原則。