策略模式,就是能够把一系列“可互换的”算法封装起来,并根据用户需求来选择其中一种。

我们可以通过这种模式将一个父类中会变化的部分提取并封装起来,以便此后可以轻易地改变或者扩展这部分,而不影响其他部分。

--文字部分来源于《Python编程实战》《深入浅出设计模式》

接下来我会依次写出最优的Python实现代码。

我们以《深入浅出设计模式》一书中的例子为例来说明:

即模拟一款游戏,里面有各种各样的鸭子,这里我们只设计两种,一种是会飞的鸭子,另一种是会叫的鸭子。

在策略模式中,有几种不同的行为就定义几个不同的接口,这里我们把会飞、不会飞、会用羽毛飞等统一称为一种行为,即飞行行为;把会呱呱叫、会哇哇叫等统一称为另一种行为,即会叫的行为。

首先,定义第一种行为接口,飞行行为接口,飞行行为下的不同种类都实现这个接口,以表示不同的飞行行为:

class FlyBehavior(object):

"""所有飞行行为都必须实现该类的fly方法"""

def fly(self):

raise NotImplementedError()

class FlyDuckWithWings(FlyBehavior):

"""会用羽毛飞的鸭子继承飞行行为类,实现飞行接口"""

def fly(self):

print("老子有羽毛,老子会飞,你们会么。2333333。")

class FlyDuckNoWay(FlyBehavior):

"""不会飞的鸭子,继承飞行行为类,实现飞行接口"""

def fly(self):

print("我不会飞,坐在角落里诅咒你们掉下来。")

接着定义鸭叫这个行为接口:

class QuackBehavior(object):

"""呱呱叫的行为接口类"""

def quack(self):

raise NotImplementedError()

class DuckQuackGua(QuackBehavior):

"""只会呱呱叫的鸭子"""

def quack(self):

print("看见美鸭,我会呱呱叫。呱呱呱......")

class DuckQuackWa(object):

"""只会哇哇叫的鸭子"""

def quack(self):

print("看见帅鸭,我会哇哇叫。哇哇哇......")

这两种行为类定义完成,并有行为子类定义完成之后,就要定义鸭子类型了。

class Duck(object):

"""鸭子对象"""

# 为了简单说明,在这里直接放置两个参数,如果大家想要更好的实现,可以使用set方法进行设置

def __init__(self, fly_duck, quack_duck):

self.fly_duck = fly_duck

self.quack_duck = quack_duck

def fly(self):

self.fly_duck.fly()

def quack(self):

self.quack_duck.quack()

好了,我们测试一下:

if __name__ == '__main__':

fly_gua_duck = Duck(FlyDuckWithWings(), DuckQuackGua()) # 创建一个会飞会呱的鸭子

fly_gua_duck.fly()

fly_gua_duck.quack()

no_fly_wa_duck = Duck(FlyDuckNoWay(), DuckQuackWa()) # 创建一个不会飞,只会哇哇叫的鸭子

no_fly_wa_duck.fly()

no_fly_wa_duck.quack()

在上面,我们测试时,使用了类的实例。我们继续精简一下,使用静态方法。

class FlyBehavior(object):

"""所有会飞的行为都必须继承该类,并实现其fly方法"""

@staticmethod

def fly():

raise NotImplementedError()

class FlyDuckWithWings(FlyBehavior):

"""会飞的鸭子继承会飞行为类,实现飞行接口"""

@staticmethod

def fly():

print("老子有羽毛,老子会飞,你们会么。2333333。")

class FlyDuckNoWay(FlyBehavior):

"""不会飞的鸭子,继承飞行行为类,实现飞行接口"""

@staticmethod

def fly():

print("我不会飞,坐在角落里诅咒你们掉下来。")

这样,我们在测试的时候,传入类就可以了,无需实例出一个对象来。

好像这种方式也不是很好,接下来,我们使用函数来实现这种行为。

class Duck(object):

"""鸭子对象"""

def __init__(self, fly_duck, quack_duck):

self.fly_duck = fly_duck

self.quack_duck = quack_duck

def fly_with_wings():

print("老子有羽毛,老子会飞,你们会么。2333333。")

def fly_no_way():

print("我不会飞,坐在角落里诅咒你们掉下来。")

def quack_gua():

print("看见美鸭,我会呱呱叫。呱呱呱......")

def quack_wa():

print("看见帅鸭,我会哇哇叫。哇哇哇......")

if __name__ == '__main__':

fly_gua_duck = Duck(fly_with_wings(), quack_gua()) # 创建一个会飞会呱的鸭子

fly_gua_duck.fly

fly_gua_duck.quack

no_fly_wa_duck = Duck(fly_no_way(), quack_wa())

no_fly_wa_duck.fly

no_fly_wa_duck.quack

哈哈,这样是不是精简了很多,但是在测试的时候,我们传入了函数实例,继续精简。

class Duck(object):

"""鸭子对象"""

def __init__(self, fly_duck, quack_duck):

self.fly_duck = fly_duck

self.quack_duck = quack_duck

def fly_with_wings():

print("老子有羽毛,老子会飞,你们会么。2333333。")

def fly_no_way():

print("我不会飞,坐在角落里诅咒你们掉下来。")

def quack_gua():

print("看见美鸭,我会呱呱叫。呱呱呱......")

def quack_wa():

print("看见帅鸭,我会哇哇叫。哇哇哇......")

if __name__ == '__main__':

fly_gua_duck = Duck(fly_with_wings, quack_gua) # 创建一个会飞会呱的鸭子

fly_gua_duck.fly_duck()

fly_gua_duck.quack_duck()

no_fly_wa_duck = Duck(fly_no_way, quack_wa)

no_fly_wa_duck.fly_duck()

no_fly_wa_duck.quack_duck()

嗯,最后一种,我们传入函数对象,直接使用函数对象的callable属性就可以了。

python策略模式的应用_策略模式-Python四种实现方式相关推荐

  1. 库卡机器人bco运动_库卡KUKA机器人四种启动方式

    库卡机器人四大启动方式说明 1.自动运行方式 (1)自动运行说明 库卡机器人处于自动运行时,先要在手动状态时候选择需要运行的程序,然后通过钥匙开关切换机器人到自动运行状态,给机器人上电,然后启动机器人 ...

  2. python 单例模式的实现方法_python中单例模式的四种实现方式

    配置文件settings.py IP='100.0.0.2' PORT=3302 方式一:绑定给类的方法 class Mysql: __instance = None def __init__(sel ...

  3. 服务器和交换机物理连接_收藏 | 交换机的四种组网方式以及常见八种故障解决方法...

    交换机是网络搭建中非常重要的一个部分,一些朋友对于如何选择交换机存有疑惑.其实在选择交换机之前应该先了解交换机是怎么进行组网的.本文整理了交换机在四种网络情况下的组网方式以及组网常见的故障解决方案. ...

  4. 单例模式的四种实现方式(饿汉模式、懒汉模式、静态内部类、枚举类)

    首先,设计模式是我们程序员在软件开发过程中面临的一般问题的解决方案,通过学习设计模式可以使我们在编程时更加有条理性,同时培养我们写代码的思维能力,从而提高我们的工作效率.接下来就跟着博主的脚步往下走吧 ...

  5. 【Python基础】Python爬虫的两套解析方法和四种信息提取方式

    Python爬虫 Author:Iouwill Machine Learning Lab 分享一篇往日旧文章,非常实用. 对于大多数朋友而言,爬虫绝对是学习python的最好的起手和入门方式.因为爬虫 ...

  6. python创建单例模式_Python单例模式的四种创建方式实例解析

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  7. Python爬虫入门之爬虫解析提取数据的四种方法

    本文主要介绍了Python爬虫入门之爬虫解析提取数据的四种方法,通过具体的内容向大家展现,希望对大家Python爬虫的学习有所帮助. 基础爬虫的固定模式 笔者这里所谈的基础爬虫,指的是不需要处理像异步 ...

  8. hfc网络文件服务器,网络、LAN、HFC、PLC四种接入方式的总结_网络_LAN_HFC_课课家...

    现在几乎每家每户应该都通了宽带,目前,家庭用户的宽带接入主要有ADSL.LAN.HFC.四种方式可以实现,而由于拥有网络的限制,任何一家宽带接入服务商为用户提供的接入方式只能是其中的一种或两种.现在互 ...

  9. mysql的四种连接方式_数据库的四种连接方式分别是什么

    数据库的四种连接方式分别是:1.inner join内连接:2.outer join外连接:3.cross join交叉连接:4.natural join自然连接. 内连接 内连接 ---拼接查询结果 ...

  10. python下载文件到本地-Python下载网络文本数据到本地内存的四种实现方法示例

    本文实例讲述了Python下载网络文本数据到本地内存的四种实现方法.分享给大家供大家参考,具体如下: import urllib.request import requests from io imp ...

最新文章

  1. NDK 与 JNI 的关系
  2. Linux常用命令——useradd,usermod
  3. Attachment rename issue in Faas
  4. 依据imu姿态角计算z轴倾角_1. 姿态的表示方法
  5. mysql字段唯一确定_验证表里某不确定的字段的值是否唯一的方法?
  6. multi task训练torch_手把手教你使用PyTorch(2)-requires_gradamp;computation graph
  7. 全国计算机等级考试二级Python考试大纲预测和分析
  8. epub 阅读器_全球与中国EPUB阅读器市场深度调研分析报告
  9. [No0000E0]批量打开当前路径下的文件
  10. matlab 行 读取文件 跳过_Matlab调试:跳过下一行而不执行
  11. 模糊控制算法的C++实现
  12. hypersion oracle_Oracle Hyperion财务管理之合并报表
  13. 自适应中值滤波器(基于OpenCV实现)
  14. 华为ensp的缺省_网络 华为 ensp 命令
  15. 计算机涉及数学知识点,2019计算机考研数学知识点解读:一元函数积分学
  16. python低通滤波器设计(FIR, IIR)
  17. u盘服务器安装win7系统安装教程,最简单的u盘装win7系统详细教程及步骤
  18. 程序员的未来之路[转]
  19. 戴尔服务器r720怎么进入系统安装,戴尔R720服务器安装步骤.doc
  20. TM1637芯片驱动数码管 – play with TM1637 seven segment display driver

热门文章

  1. 敏捷组织︱如何打造VUCA时代的敏捷型组织?
  2. 如果非要回到古代,我会选择春秋战国
  3. html风琴图片展示,基于jquery的手风琴图片展示效果实现方法
  4. B站哔哩哔哩视频一键下载,这个视频下载工具太给力了
  5. 接口安全评估基本流程
  6. 二十四节气-寒露,月斜寒露白,此夕去留心
  7. Java回收对象的标记 和 对象的二次标记过程
  8. html右边显示不全,显示器右边显示不全怎么办
  9. 交流电路计算方法:复阻抗和相量法
  10. WEB安全(十六)单点登录的基本实现