栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python策略模式

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python策略模式

标签: 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
尾声

这就是策略模式。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号