Swift設(shè)計(jì)模式----策略模式

策略模式:定義一系列的算法,把它們一個(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),符合開閉原則。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容