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策略模式

    策略模式,同一问题有多种不同的解法,即不同策略,一个物体可以动态地对策略进行更换。

  • Python策略模式

    [python|高级篇|笔记|设计模式|策略模式] 引子 接着开始吧,还是读了HF之后的学习记录。继承并不是适当的...

  • 设计模式(Python)-策略模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是...

  • Python设计模式 - 策略模式

    """ 策略模式:是一种定义一系列算法的方法,从概念上,所有这些算法完成的都是相同的工作,只是实现不同。 所以可以...

  • python-策略模式

    这一节,我们使用python的策略模式进行一个简单的打折相关的设计开发(这里参考了-大话设计模式一书,有时间的同学...

  • Python 之策略模式

    简介:策略模式(Pattern:Strategy)属于行为型模式,是指对一系列的算法定义,并将每一个算法封装起来,...

  • python 实现策略模式

    策略模式    定义一系列算法,把它们一一封装起来,并且使它们之间可以相互替换。此模式让算法的变化不会影响到使用算...

  • 11.7设计模式-策略模式-详解

    设计模式-策略模式 策略模式详解 策略模式在android中的实际运用 1.策略模式详解 2.策略模式在andro...

  • Python设计模式之策略模式

    前言 设计模式是我们实际应用开发中必不可缺的,对设计模式的理解有助于我们写出可读性和扩展更高的应用程序。虽然设计模...

  • [Python设计模式] 02 - 策略模式

    设计模式的目的是让代码易维护、易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的。 策略模式...

网友评论

    本文标题:Python策略模式

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