Python策略模式

[python|高級篇|筆記|設(shè)計(jì)模式|策略模式]

引子

接著開始吧,還是讀了HF之后的學(xué)習(xí)記錄。
繼承并不是適當(dāng)?shù)慕鉀Q方式,因?yàn)閷ο蟮男袨樵谧宇惱锩娌粩嘧兓?,并且讓所有子類都有這些行為是不恰當(dāng)?shù)摹?br> 設(shè)計(jì)原則

找出可能需要變化的部分,把他們獨(dú)立出來,不要和那些不需要變化的代碼混在一起

正文

如果每次新的需求一來,都會(huì)使某方面的代碼變化,那么就可以確定,這部分的代碼需要抽離出來,和其他穩(wěn)定的代碼有所區(qū)分,把會(huì)變化的部分取出來并封裝起來,以便以后可以輕易地改動(dòng)或擴(kuò)充此部分,而不影響不需要變化的其他部分。
找個(gè)例子來說明這個(gè)事,設(shè)計(jì)一個(gè)游戲,游戲里面有各種各樣的武器,各種各樣的職業(yè),各種各樣的技能,這里需要?jiǎng)?chuàng)建一個(gè)拿著劍具有玉女心經(jīng)劍法技能的國王職業(yè)的人物,該怎么去實(shí)現(xiàn)呢?
先取出要變化的部分,武器,技能,人物可能都會(huì)發(fā)生變化,我可能增加一個(gè)武器,修煉一項(xiàng)新的技能,創(chuàng)建一個(gè)新的職業(yè),這些變化的部分取出來,單獨(dú)實(shí)現(xiàn)。
接著創(chuàng)建一個(gè)客戶類,由用戶自行制定需要?jiǎng)?chuàng)建出什么樣的人物

代碼

分別定義武器,職業(yè),技能的實(shí)現(xiàn)
武器

class SwordBehavior(object):
    def __init__(self):
        self.behaviorCode = "SWORD"
    def __call__(self):
        return "use the sword"
class KnifeBehavior(object):
    def __init__(self):
        self.behaviorCode = "KNIFE"
    def __call__(self):
        return "use the knife"
class BowAndArrowBehavior(object):
    def __init__(self):
        self.behaviorCode = "BOWANDARROW"
    def __call__(self):
        return "use the bow and arrow"
class AxeBehavior(object):
    def __init__(self):
        self.behaviorCode = "AXE"
    def __call__(self):
        return "use the axe"

職業(yè)

class KingFigure(object):
    def __init__(self):
        self.figureCode = "KING"
    def __call__(self):
        return "I am a king"
class QueenFigure(object):
    def __init__(self):
        self.figureCode = "QUEEN"
    def __call__(self):
        return "I am a queen"
class TrollFigure(object):
    def __init__(self):
        self.figureCode = "TROLL"
    def __call__(self):
        return "I am a troll"
class KnightFigure(object):
    def __init__(self):
        self.figureCode = "KNIGHT"
    def __call__(self):
        return "I am a knight"

技能

class attack1Method(object):
    def __init__(self):
        self.attackCode = "ATTACK1"
    def __call__(self):
        return "with attack1"
class attack2Method(object):
    def __init__(self):
        self.attackCode = "ATTACK2"
    def __call__(self):
        return "with attack2"
class attack3Method(object):
    def __init__(self):
        self.attackCode = "ATTACK3"
    def __call__(self):
        return "with attack3"

創(chuàng)建一個(gè)類來設(shè)定每個(gè)人物

class CharacterCreator(object):
    def __init__(self):
        self.__weaponImpls = [SwordBehavior(),
                        KnifeBehavior(),
                        BowAndArrowBehavior(),
                        AxeBehavior()]
        self.__figureImpls = [KingFigure(),
                              QueenFigure(),
                              TrollFigure(),
                              KnightFigure()]
        self.__attackImpls = [attack1Method(),
                              attack2Method(),
                              attack3Method]
    def __call__(self, weapon, character, attack):
        for wimpl in self.__weaponImpls:
            if wimpl.behaviorCode == weapon:
                for fimpl in self.__figureImpls:
                    if fimpl.figureCode == character:
                        for aimpl in self.__attackImpls:
                            if aimpl.attackCode == attack:
                                return fimpl() + " " +wimpl() + " " + aimpl()

之后,搞點(diǎn)數(shù)據(jù)測試一下

def main():
    chracterCreator = CharacterCreator()
    king = chracterCreator("SWORD", "KING", "ATTACK1")
    queen = chracterCreator("KNIFE", "QUEEN", "ATTACK2")
    print(king)
    print(queen)
if __name__ == '__main__':
    main()

輸出的結(jié)果

I am a king use the sword with attack1
I am a queen use the knife with attack2

尾聲

這就是策略模式,也不知道對不對。

最后編輯于
?著作權(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)容

  • 本系列文章是希望將軟件項(xiàng)目中最常見的設(shè)計(jì)模式用通俗易懂的語言來講解清楚,并通過Python來實(shí)現(xiàn),每個(gè)設(shè)計(jì)模式都是...
    geekpy閱讀 1,978評論 0 19
  • 這一節(jié),我們使用python的策略模式進(jìn)行一個(gè)簡單的打折相關(guān)的設(shè)計(jì)開發(fā)(這里參考了-大話設(shè)計(jì)模式一書,有時(shí)間的同學(xué)...
    KillerManA閱讀 680評論 0 0
  • 策略模式,同一問題有多種不同的解法,即不同策略,一個(gè)物體可以動(dòng)態(tài)地對策略進(jìn)行更換。
    蝦想家閱讀 272評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,068評論 25 709
  • Android單元測試 創(chuàng)建android studio工程,在app目錄下的build.gradle中加入JUn...
    Anne_胖達(dá)閱讀 1,070評論 0 0

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