1. 策略模式(Strategy)介绍

UML类图

角色介绍

  • 封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。
  • 抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。
  • 具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。

用途

定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。

优点

  • 策略类之间可以自由切换,由于策略类实现自同一个抽象,所以他们之间可以自由切换。
  • 易于扩展,增加一个新的策略对策略模式来说非常容易,基本上可以在不改变原有代码的基础上进行扩展。
  • 避免使用多重条件,如果不使用策略模式,对于所有的算法,必须使用条件语句进行连接,通过条件判断来决定使用哪一种算法,在上一篇文章中我们已经提到,使用多重条件判断是非常不容易维护的。

缺点

  • 维护各个策略类会给开发带来额外开销,可能大家在这方面都有经验:一般来说,策略类的数量超过5个,就比较令人头疼了。
  • 必须对客户端(调用者)暴露所有的策略类,因为使用哪种策略是由客户端来决定的,因此,客户端应该知道有什么策略,并且了解各种策略之间的区别,否则,后果很严重。例如,有一个排序算法的策略模式,提供了快速排序、冒泡排序、选择排序这三种算法,客户端在使用这些算法之前,是不是先要明白这三种算法的适用情况?再比如,客户端要使用一个容器,有链表实现的,也有数组实现的,客户端是不是也要明白链表和数组有什么区别?就这一点来说是有悖于迪米特法则的。

2. 示例

策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。在前面说过的行为类模式中,有一种模式也是关注对算法的封装——模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在于:在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中,抽象策略Strategy一般是一个接口,目的只是为了定义规范,里面一般不包含逻辑。其实,这只是通用实现,而在实际编程中,因为各个具体策略实现类之间难免存在一些相同的逻辑,为了避免重复的代码,我们常常使用抽象类来担任Strategy的角色,在里面封装公共的代码,因此,在很多应用的场景中,在策略模式中一般会看到模版方法模式的影子。

"""Strategy Pattern with Python Code
"""from abc import abstractmethod, ABCMetaclass IStrategy(metaclass=ABCMeta):@abstractmethoddef doSomething(self):passclass ConcreteStrategy1(IStrategy):def doSomething(self):print("具体策略1")class ConcreteStrategy2(IStrategy):def doSomething(self):print("具体策略2")class Context(object):def __init__(self, strategy:IStrategy):self.strategy = strategydef execute(self):self.strategy.doSomething()class Client(object):def main(self):print("-----执行策略1-----")context = Context(ConcreteStrategy1())context.execute()print("-----执行策略2-----")context = Context(ConcreteStrategy2())context.execute()if __name__ == "__main__":Client().main()

输出:

# ./Strategy.py
-----执行策略1-----
具体策略1
-----执行策略2-----
具体策略2

参考:
https://wiki.jikexueyuan.com/project/java-design-pattern/strategy-pattern.html

python设计模式21-策略模式相关推荐

  1. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  2. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  3. 面向对象设计模式之策略模式

    面向对象设计模式之策略模式 1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2.抽象鸭子类,鸭子飞行行为在此处类似于算法族 1 package ...

  4. 揭秘设计模式:策略模式(Strategy)的枚举(Enum)实现

    2019独角兽企业重金招聘Python工程师标准>>> 链接地址:http://www.xx566.com/detail/120.html 上一篇:揭秘设计模式:策略模式(Strat ...

  5. Java设计模式之策略模式+工厂模式+模板模式

    Java设计模式之策略模式+工厂模式+模板模式 1.策略模式+工厂模式+模板模式 个人的理解:实际开发工程中,一些业务很复杂的逻辑使用很多的 if 或者 if···else 语句,不利于维护和扩展,为 ...

  6. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  7. Python设计模式-中介者模式

    Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...

  8. Python设计模式-职责链模式

    Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...

  9. Python设计模式-享元模式

    Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...

  10. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

最新文章

  1. 从n返回k个元素的所有组合的算法
  2. 加薪方式的真相!你是哪一种?
  3. 大型网站SEO执行策略
  4. c0000005错误怎么解决_iTunes提示3194未知错误怎么办【解决方法】
  5. cocoaPod集成9大环境以及报错项目问题
  6. [css] font-style的属性有Italic和oblique,两者有什么区别呢
  7. JavaScript从入门到放弃 -(五)函数进阶(高级用法)
  8. NSDate的简单用法
  9. spring整合mybatis的坑
  10. Python,PyCharm2017安装教程,包含注册码
  11. linux系统可以玩星际争霸吧,在Linux下可用Wine安装和运行星际争霸2、水煮三国
  12. 地铁服务器的系统,地铁综合监控系统
  13. CSS盒模型完整介绍
  14. Git的下载安装 (图文教程)
  15. 计算机主板chipset中的北桥和南桥
  16. Mask RCNN 实战(二)--像黑镜一样屏蔽图片和视频中的人和物体
  17. 什么叫云计算?云计算通俗解释
  18. matlab输入数据作方程,用MATLAB函数编写并求解微分方程
  19. Android 7.0 新特性
  20. 统计学-常用数据分析方法

热门文章

  1. 笔试算法题(26):顺时针打印矩阵 求数组中数对差的最大值
  2. memcache服务应用实践
  3. Go语言游戏服务器思维导图
  4. spring配置jdbc连接oracle,mysql,sqlserver
  5. 微信小程序 this和that详解及简单实例
  6. php 自定义 $_SERVER
  7. NSBundle 的理解和 mainBundle
  8. Disabling contextual LOB creation as createClob()
  9. MySQL(root用户)密码重置
  10. 统计图学习-类型介绍