設(shè)計模式的目的是讓代碼易維護(hù)、易擴(kuò)展仍秤,不能為了模式而模式熄诡,因此一個簡單的工具腳本是不需要用到任何模式的。
策略模式: 定義了算法家族诗力,分別封裝起來凰浮,讓他們之間可以互相替換。此模式讓算法的變化不影響使用算法的客戶苇本。
代碼框架
class Strategy(object):
"""抽象算法類"""
def AlgorithmInterface(self):
raise NotImplementedError()
class ConcreteStrategyA(Strategy):
def AlgorithmInterface(self):
print '算法A'
class ConcreteStrategyB(Strategy):
def AlgorithmInterface(self):
print '算法B'
class Context(object):
"""上下文袜茧,作用就是封裝策略的實(shí)現(xiàn)細(xì)節(jié),用戶只需要知道有哪些策略可用"""
def __init__(self, strategy):
# 初始化時傳入具體的策略實(shí)例
self.strategy = strategy
def ContextInterface(self):
# 負(fù)責(zé)調(diào)用具體的策略實(shí)例的接口
self.strategy.AlgorithmInterface()
def client(cond):
# 策略模式的使用演示
# 用戶只需要根據(jù)不同的條件瓣窄,將具體的算法實(shí)現(xiàn)類傳遞給Context惫周,
# 然后調(diào)用Context暴露給用戶的接口就行了。
if cond == 'A':
context = Context(ConcreteStrategyA())
elif cond == 'B':
context = Context(ConcreteStrategyB())
result = context.ContextInterface()
策略模式解決那類問題
在回答這個問題之前康栈,先說下對策略模式的使用方式的感覺。上面的client
函數(shù)喷橙,怎么看起來就像是簡單工廠模式中的工廠函數(shù)呢啥么?確實(shí)如此,實(shí)際上策略模式可以和簡工廠模式結(jié)合起來贰逾,將更多細(xì)節(jié)封裝在策略模式內(nèi)部悬荣,讓使用者更容易的使用。
那么策略模式和簡單工廠模式有什么不同呢疙剑?策略模式中的算法是用來解決同一個問題的氯迂,根據(jù)時間践叠、條件不同,算法的具體細(xì)節(jié)有差異嚼蚀,但最終解決的是同一個問題禁灼。在需求分析過程中,當(dāng)聽到需要在不同時間應(yīng)用不同的業(yè)務(wù)規(guī)則轿曙,就可以考慮使用策略模式來處理這種變化的可能性弄捕。
缺點(diǎn)
- 使用者需要知道每一種策略的具體含義,并負(fù)責(zé)選擇策略
改進(jìn)
結(jié)合簡單工廠模式导帝,將策略選擇封裝在Context內(nèi)部守谓,解放client:
class Context(object):
def __init__(self, cond):
if cond == 'A':
self.strategy = Context(ConcreteStrategyA())
elif cond == 'B':
self.strategy = Context(ConcreteStrategyB())
def ContextInterface(self):
self.strategy.AlgorithmInterface()
def client(cond):
context = Context(cond)
result = context.ContextInterface()
改進(jìn)后的遺留問題
每次需要增加新的策略時,就需要修改Context的構(gòu)造函數(shù)您单,增加一個新的判斷分支斋荞。
原文地址:http://www.isware.cn/python-design-pattern/03-strategy/