Python設計模式-策略模式
Python設計模式-策略模式
程式碼基於3.5.2,程式碼如下;
#coding:utf-8
#策略模式
class sendInterface():
def send(self,value):
raise NotImplementedError
class phone(sendInterface):
def send(self,value):
print("phone send:",value)
class email(sendInterface):
def send(self,value):
print("email send:",value)
class weixin(sendInterface):
def send(self,value):
print("weixin send:",value)
class content():
def __init__(self,sendMethod):
self.sendMethod = sendMethod
def send(self,value):
self.sendMethod.send(value)
if __name__ == "__main__":
ph = content(phone())
ph.send("回家吃飯")
em = content(email())
em.send("回家吃飯")
wx = content(weixin())
wx.send("回家吃飯")
策略模式的分析與解讀
策略模式
策略模式,它定義了演算法家族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。橋接模式與策略模式在結構上高度同構,我們要從使用意圖上區分兩種模式:橋接模式解決抽象角色和實現角色都可以擴充套件的問題,策略模式解決演算法切換和擴充套件的問題。
程式碼解讀
1、先定義方法的實現介面類sendInterface,讓所有繼承該類的類實現send方法;
2、通過繼承sendInterface類,分別定義了phone、email和weixin三個類,並實現了各自不同的send()方法;
3、通過定義content類,在初始化時,傳入對應的方法類,然後統一使用send()方法呼叫方法類對應實現的send()方法,從而完成通過content完成不同方法的呼叫。
程式碼執行結果如下:
”’
phone send: 回家吃飯
email send: 回家吃飯
weixin send: 回家吃飯
”’
策略模式應用場景:
1、策略模式比較經常地需要被替換時,可以使用策略模式。如在付賬問題時,會遇到刷卡、某寶支付等問題時,可以考慮策略模式。
優缺點分析
優點
1、各個策略可以自由切換;這也是依賴抽象類設計介面的好處之一;
2、減少冗餘程式碼;
3、擴充套件性好;
4、優化了單元測試,每個實現方法的類都可以進行自己的單獨測試;
缺點
1、專案比較龐大時,策略模式使用多時,不便於維護;
2、策略的使用方必須知道有哪些策略,才能決定使用哪一個策略,這與迪米特法則違背。
備註
迪米特法則:如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用。如果其中一個類需要呼叫另一個類的某一個方法的話,可以通過第三者轉發這個呼叫。
策略模式也可與簡單工廠模式相互配合使用:
class sendInterface():
def send(self,value):
raise NotImplementedError
class phone(sendInterface):
def send(self,value):
print("phone send:",value)
class email(sendInterface):
def send(self,value):
print("email send:",value)
class weixin(sendInterface):
def send(self,value):
print("weixin send:",value)
class contentFactory():
sendMethod = None
def createFactory(self,type):
if type == "phone":
self.sendMethod = phone()
elif type == "email":
self.sendMethod = email()
elif type == "weixin":
self.sendMethod = weixin()
def send(self,value):
self.sendMethod.send(value)
if __name__ == "__main__":
factory = contentFactory()
factory.createFactory("phone")
factory.send("回家吃飯")
factory.createFactory("email")
factory.send("回家吃飯")
factory.createFactory("weixin")
factory.send("回家吃飯")
相關文章
- python設計模式之策略模式Python設計模式
- 12、Python與設計模式–策略模式Python設計模式
- 設計模式——策略模式設計模式
- 設計模式(策略模式)設計模式
- 設計模式-策略模式設計模式
- 設計模式🔫---策略模式設計模式
- 設計模式之策略模式設計模式
- js設計模式--策略模式JS設計模式
- 小白設計模式:策略模式設計模式
- 設計模式之【策略模式】設計模式
- 設計模式(一) 策略模式設計模式
- php設計模式–策略模式PHP設計模式
- 設計模式(八)——策略模式設計模式
- 設計模式(四):策略模式設計模式
- 設計模式-策略模式(轉)設計模式
- 【設計模式之策略模式】設計模式
- 設計模式 #5 (策略模式、代理模式)設計模式
- 【設計模式】漢堡中的設計模式——策略模式設計模式
- 【經典案例】Python詳解設計模式:策略模式Python設計模式
- Python 中的設計模式詳解之:策略模式Python設計模式
- PHP 設計模式之策略模式PHP設計模式
- 設計模式(一) 支付策略模式設計模式
- JavaScript 設計模式之策略模式JavaScript設計模式
- 設計模式專題-策略模式設計模式
- Javascript設計模式之策略模式JavaScript設計模式
- JAVA設計模式之策略模式Java設計模式
- 略懂設計模式之策略模式設計模式
- Javascript設計模式(四)策略模式JavaScript設計模式
- JS設計模式六:策略模式JS設計模式
- PHP設計模式(3)—— 策略模式PHP設計模式
- 極簡設計模式-策略模式設計模式
- GoLang設計模式15 - 策略模式Golang設計模式
- Java設計模式-策略模式分析Java設計模式
- 設計模式-策略模式(strategy pattern)設計模式
- 設計模式系列之「策略模式」設計模式
- 設計模式——13策略模式(strategy)設計模式
- 【大話設計模式】——策略模式設計模式
- 設計模式(六)策略模式Strategy設計模式