Python中的策略模式

策略模式学习与记录

  • 设计原则
    • 找出应用中可能需要改变之处, 把他们独立出来, 不要和那些不需要改变的代码混在一起
    • 针对接口编程而不是针对实现编程

不要被类的实现拖垮你的代码, 针对接口编程的关键, 在于利用多态 执行时会根据状况执行到真正的行为

代码实现如下


import abc


class FlyBehavior:
    """ pass """
    __metaclass__ = abc.ABCMeta

    @classmethod
    @abc.abstractmethod
    def fly(cls):
        """ pass """


class FlyWithWings(FlyBehavior):
    """ pass """
    @classmethod
    def fly(cls):
        """ pass """
        print('I can fly')


class FlyNoWay(FlyBehavior):
    """ pass """
    @classmethod
    def fly(cls):
        """ pass """


class QuackBehavior:
    """ pass """
    __metaclass__ = abc.ABCMeta

    @classmethod
    @abc.abstractmethod
    def quack(cls):
        """ pass """


class Quack(QuackBehavior):
    """ pass """
    @classmethod
    def quack(cls):
        """ pass """
        print('I can quack ... gua gua gua !')


class Squeak(QuackBehavior):
    """ pass """
    @classmethod
    def quack(cls):
        """ pass """
        print('I can quack ... zhi zhi zhi !')


class QuackNotWay(QuackBehavior):
    """ pass """
    @classmethod
    def quack(cls):
        """ pass """


class Duck:
    """ pass """
    def __init__(self, _fly, _quack):
        """ pass """
        self.__quack = _quack()
        self.__fly = _fly()

    def swim(self):
        """ pass """
        print('swiming ...!')

    def display(self):
        """ pass """
        self.__quack.quack()
        self.__fly.fly()
        self.swim()


class MallardDuck(Duck):
    """ pass """
    def __init__(self, _fly, _quack):
        """ pass """
        print('MallardDuck')
        super(MallardDuck, self).__init__(_fly, _quack)


class RubberDuck(Duck):
    """ 橡皮鸭 """
    def __init__(self, _fly, _quack):
        """ pass """
        print('RubberDuck')
        super(RubberDuck, self).__init__(_fly, _quack)


class DecoyDuck(Duck):
    """ 诱饵鸭 """
    def __init__(self, _fly, _quack):
        """ pass """
        print('DecoyDuck')
        super(DecoyDuck, self).__init__(_fly, _quack)

if __name__ == '__main__':
    mallar = MallardDuck(FlyWithWings, Quack)
    mallar.display()
    rubber = RubberDuck(FlyNoWay, Squeak)
    rubber.display()
    decoy = DecoyDuck(FlyNoWay, QuackNotWay)
    decoy.display()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,906评论 25 708
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,087评论 18 399
  • མ་འོངས་བའི་ཁྱོད། འཇིགས་མེད་བསམ་གཏན། རི་བོ་མ...
    久买三旦阅读 128评论 0 0
  • 1. 年初一时,姨夫指出要乘着春节多开汽车争取上手,截止今日已经连续开了两天,每天约2个小时。昨天开了从家到单位的...
    wadforever阅读 127评论 0 1
  • 第一卷 绝望和孤独 第二章 马贼来了 太阳像个害羞的女子,透过厚厚云层的缝隙,近乎吝啬地把温柔投给大地。小玄...
    呆萌小熊猫阅读 775评论 3 5

友情链接更多精彩内容