1. 策略模式解決的是什麼問題
策略模式解決的應用場景是這樣的: 在業務場景中,需要用到多個算法,並且每個算法的參數是需要調整的。那麼當不同的行爲堆砌到同一個類中時,我們很難避免使用條件語句來選擇合適的行爲。我們需要解決的是把算法封裝起來,達到算法的變化不會影響到使用算法的客戶的效果。實際上就是把算法模塊給完全獨立出來,並且易於配置、修改和擴展,實現“開閉”原則。
通俗來講就是針對一個問題而定義出一個解決的模板,這個模板就是具體的策略,每個策略都是按照這個模板來的。這種情況下我們有新的策略時就可以直接按照模板來寫,而不會影響之前已經定義好的策略。只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。
2. 什麼是策略模式
策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方式調用所有的算法,減少了各種算法類與算法使用類之間的耦合。
策略模式的Strategy類層次爲Context定義了一系列可供重用的算法或者行爲。繼承有助於提取出這些算法中的公共功能。
策略模式的另一個優點:簡化了單元測試。每個算法都有自己的類,是可以做自己的接口單獨測試。
策略模式指對一系列的算法定義,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。
3. 策略模式的具體實現
#!/usr/bin/python3 # -*- coding: utf-8 -*- class CashStrategy(object): def __init__(self): pass def charge(self): pass class CashNormal(CashStrategy): def charge(self,money): return money class CashRebate(CashStrategy): def __init__(self, rebate): self.rebaterate = rebate def charge(self, money): return money * self.rebaterate class CashReturn(CashStrategy): def __init__(self, return_standard, return_money): self.return_standard = return_standard self.return_money = return_money def charge(self, money): if money >= self.return_standard: return money - self.return_money else: return money class CashContext(object): def __init__(self, charge_type, *charge_parameters): self.charge_type = charge_type if charge_type == 'Normal': self.current_strategy = CashNormal() if charge_type == 'Rebate': self.current_strategy = CashRebate(charge_parameters[0]) if charge_type == 'Return': self.current_strategy = CashReturn(charge_parameters[0],charge_parameters[1]) def charge_money(self,money): #print(self.charge_parameters) return self.current_strategy.charge(money) if __name__ == "__main__": charge_cash_1 = CashContext('Rebate',0.8) print('Rebate: ',charge_cash_1.charge_money(200)) charge_cash_2 = CashContext('Normal') print('Normal: ',charge_cash_2.charge_money(200)) charge_cash_3 = CashContext('Return',200,100) print('Return: ',charge_cash_3.charge_money(200))
Rebate: 160.0
Normal: 200
Return: 100
4. 策略模式與工廠模式的異同
相同點:
實際上,我們發現策略模式和工廠模式是很像的。本質實現上都是子類覆蓋父類,利用了語言的繼承特性。
工廠模式中,每個要實現的類,可以對應到策略模式中每個具體的Strategy。
而工廠模式中的Factory,又可以對應到策略模式中的Context類。因爲都在裏面進行了對不同情況的處理(判斷要實現哪個類,判斷要採取哪種策略)
不同點:
用途不一樣
工廠是創建型模式,它的作用就是創建對象;
策略是行爲型模式,它的作用是讓一個對象在許多行爲中選擇一種行爲;
關注點不一樣
一個關注對象創建
一個關注行爲的封裝
簡單工廠模式只是解決了對象的創建問題,工廠需要包括所有的產品對象的創建,如果產品對象形式經常變化,就需要經常改動工廠,以致代碼重新編譯。所以策略模式就誕生了,策略模式---它定義了算法家族,分別封裝起來,而不是像簡單產品模式一樣定義所有的產品類,讓他們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶,使客戶擁有相同的訪問過程。
所以我認爲除了概念上的側重點不同(用途,關注點),兩者最明顯的差異就是:策略模式中,不同的模式之間可以相互替換,不會影響到使用算法的客戶。而工廠模式中,各個類不能相互替換。
參考鏈接:
1. 《大話設計模式》
2. 工廠模式與策略模式之區別 https://blog.csdn.net/gaibian0823/article/details/27842443