策略模式,讓乙個類的行為或其演算法可以在執行時更改,策略是讓例項化物件動態的更改自身的某些方法使用的是types.methodtype繫結。
說起策略的動態更改方法,就不得不對比一下元類的動態增加方法,元類是類的抽象,它負責乙個抽象類建立、例項化,是通過type函式來繫結方法。
假設這樣的乙個應用場景:乙個人旅遊,在不同的國家說不通的語言。
示例code:
import types
class people:
def __init__(self, func=none):
if func:
self.speak = types.methodtype(func, self)
def speak(self):
print("說中文")
def speak_english(self):
print('說英語')
def speak_german(self):
print('說德語')
if __name__ == '__main__':
test1 = people()
test2 = people(speak_english)
test3 = people(speak_german)
[func.speak() for func in [test1, test2, test3]]
說中文說英語
說德語
使用場景:1、如果在乙個系統裡面有許多類,它們之間的區別僅在於它們的行為,那麼使用策略模式可以動態地讓乙個物件在許多行為中選擇一種行為。2、乙個系統需要動態地在幾種演算法中選擇一種。 3、如果乙個物件有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。
設計模式(二十二) 策略模式
有時候物件需要按照某種策略改變行為,我們可以利用策略模式,將策略或演算法提取出來,作為單獨的類實現。使用策略模式,可以讓具體演算法和應用物件分離,方便的根據不同條件替換策略。下面舉乙個例子。我們有乙個計算器,它會按照快和慢兩種策略來計算結果。所以我們可以將策略封裝起來。public inte ce ...
設計模式之策略模式(二十二)
strategy 抽象策略類 所有策略類的父類,為所支援的策略演算法宣告了抽象方法。concretestrategy 具體策略類 實現了在抽象策略類中宣告的方法。context 環境類 負責使用演算法策略,其中維持了乙個抽象策略類的引用例項。strategy 抽象策略類 public abstrac...
設計模式(二十二)模板模式
在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。意圖 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構...