Python策略模式

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

引子

接著開始吧,還是讀了HF之后的學(xué)習(xí)記錄。
繼承并不是適當(dāng)?shù)慕鉀Q方式,因為對象的行為在子類里面不斷變化隙疚,并且讓所有子類都有這些行為是不恰當(dāng)?shù)摹?br> 設(shè)計原則

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

正文

如果每次新的需求一來甚淡,都會使某方面的代碼變化,那么就可以確定捅厂,這部分的代碼需要抽離出來,和其他穩(wěn)定的代碼有所區(qū)分资柔,把會變化的部分取出來并封裝起來焙贷,以便以后可以輕易地改動或擴充此部分,而不影響不需要變化的其他部分贿堰。
找個例子來說明這個事辙芍,設(shè)計一個游戲,游戲里面有各種各樣的武器羹与,各種各樣的職業(yè)故硅,各種各樣的技能,這里需要創(chuàng)建一個拿著劍具有玉女心經(jīng)劍法技能的國王職業(yè)的人物纵搁,該怎么去實現(xiàn)呢吃衅?
先取出要變化的部分,武器腾誉,技能徘层,人物可能都會發(fā)生變化,我可能增加一個武器利职,修煉一項新的技能趣效,創(chuàng)建一個新的職業(yè),這些變化的部分取出來猪贪,單獨實現(xiàn)跷敬。
接著創(chuàng)建一個客戶類,由用戶自行制定需要創(chuàng)建出什么樣的人物

代碼

分別定義武器热押,職業(yè)西傀,技能的實現(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)建一個類來設(shè)定每個人物

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()

之后,搞點數(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鬼廓,隨后出現(xiàn)的幾起案子肿仑,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尤慰,死亡現(xiàn)場離奇詭異馏锡,居然都是意外死亡,警方通過查閱死者的電腦和手機伟端,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門杯道,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人责蝠,你說我怎么就攤上這事党巾。” “怎么了霜医?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵齿拂,是天一觀的道長。 經(jīng)常有香客問我肴敛,道長署海,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任医男,我火速辦了婚禮砸狞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镀梭。我一直安慰自己刀森,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布丰辣。 她就那樣靜靜地躺著撒强,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笙什。 梳的紋絲不亂的頭發(fā)上飘哨,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音琐凭,去河邊找鬼芽隆。 笑死,一個胖子當(dāng)著我的面吹牛统屈,可吹牛的內(nèi)容都是我干的胚吁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼愁憔,長吁一口氣:“原來是場噩夢啊……” “哼腕扶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吨掌,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤半抱,失蹤者是張志新(化名)和其女友劉穎脓恕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窿侈,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡炼幔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了史简。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乃秀。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖圆兵,靈堂內(nèi)的尸體忽然破棺而出跺讯,到底是詐尸還是另有隱情,我是刑警寧澤殉农,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布抬吟,位于F島的核電站,受9級特大地震影響统抬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜危队,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一涂佃、第九天 我趴在偏房一處隱蔽的房頂上張望荧琼。 院中可真熱鬧,春花似錦、人聲如沸豹芯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揽祥。三九已至,卻和暖如春桨醋,著一層夾襖步出監(jiān)牢的瞬間棚瘟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工喜最, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留偎蘸,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓瞬内,卻偏偏與公主長得像迷雪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虫蝶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

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