Python策略模式

作者: plectrum | 来源:发表于2016-02-22 21:39 被阅读398次

    [python|高级篇|笔记|设计模式|策略模式]

    引子

    接着开始吧,还是读了HF之后的学习记录。
    继承并不是适当的解决方式,因为对象的行为在子类里面不断变化,并且让所有子类都有这些行为是不恰当的。
    设计原则

    找出可能需要变化的部分,把他们独立出来,不要和那些不需要变化的代码混在一起

    正文

    如果每次新的需求一来,都会使某方面的代码变化,那么就可以确定,这部分的代码需要抽离出来,和其他稳定的代码有所区分,把会变化的部分取出来并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分。
    找个例子来说明这个事,设计一个游戏,游戏里面有各种各样的武器,各种各样的职业,各种各样的技能,这里需要创建一个拿着剑具有玉女心经剑法技能的国王职业的人物,该怎么去实现呢?
    先取出要变化的部分,武器,技能,人物可能都会发生变化,我可能增加一个武器,修炼一项新的技能,创建一个新的职业,这些变化的部分取出来,单独实现。
    接着创建一个客户类,由用户自行制定需要创建出什么样的人物

    代码

    分别定义武器,职业,技能的实现
    武器

    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"
    

    职业

    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"
    

    创建一个类来设定每个人物

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

    之后,搞点数据测试一下

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

    输出的结果

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

    尾声

    这就是策略模式,也不知道对不对。

    相关文章

      网友评论

        本文标题:Python策略模式

        本文链接:https://www.haomeiwen.com/subject/npybkttx.html