Python语言策略模式
小标 2018-12-10 来源 : 阅读 1403 评论 0

摘要:本文主要向大家介绍了Python语言策略模式,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了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
尾声
这就是策略模式。    

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved