简介:策略模式(Pattern:Strategy)属于行为型模式,是指对一系列的算法定义,并将每一个算法封装起来,而且他们是可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

模式架构

抽象策略角色[Strategy]:定义一个公共接口,各种不同的算法以不同的方式实现这个接口。

具体策略类[ConcreteStrategy]:实现类抽象策略Strategy定义的接口,包装相关的算法和行为,提供具体的算法实现。

上下文角色[Context]:持有一个策略类的引用,最终给客户端使用。

特性

优点

策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码

策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。

使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

缺点

客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

应用场景

多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

代码示例

我们以超市做活动场景来举例子。

Context:CashContext类,策略与简单工厂结合

Stragety:CashSuper类,现金收费抽象类

ContreteStragety:分三个类,CashRebate,CashNormal,CashReturn,实现具体的收费计算方法。

from abc import ABCMeta, abstractmethod

class CashSuper(object):

@abstractmethod

def acceptCash(self):

pass

class CashNormal(CashSuper):

def acceptCash(self, money):

return money

class CashRebate(CashSuper):

def __init__(self, moneyRebate):

self.moneyRebate = moneyRebate

def acceptCash(self, money):

return money * self.moneyRebate

class CashReturn(CashSuper):

def __init__(self, moneyCondition, moneyReturn):

self.moneyCondition = moneyCondition

self.moneyReturn = moneyReturn

def acceptCash(self, money):

if money > self.moneyCondition:

return money - money / self.moneyCondition * self.moneyReturn

class CashContext(object):

def __init__(self, rate):

self.cashSuper = self.getCashSuper(rate)

def getCashSuper(self, rate):

if rate == "正常收费":

return CashNormal()

elif rate == "满1000减100":

return CashReturn(1000, 100)

elif rate == "打8折":

return CashRebate(0.8)

def getResult(self, money):

return self.cashSuper.acceptCash(money)

if __name__ == '__main__':

number = 300

price = 20

cashContext = CashContext("正常收费")

result = cashContext.getResult(number * price)

print("正常收费为:%d" % result)

cashContext = CashContext("打8折")

result = cashContext.getResult(number * price)

print("打折收费为:%d" % result)

cashContext = CashContext("满1000减100")

result = cashContext.getResult(number * price)

print("打折收费为:%d" % result)

每天多努力那么一点点,积少成多

python策略模式包含角色_Python 之策略模式相关推荐

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

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

  2. python策略模式的应用_python实现策略模式

    python实现策略模式 1.策略模式概述 策略模式:定义一系列算法,把它们一一封装起来,并且使它们之间可以相互替换.此模式让算法的变化不会影响到使用算法的客户. 电商领域有个使用"策略&q ...

  3. python读excel 包含格式_python里读写excel等数据文件的几种常用方式

    python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv.txt等).excel文件.数据库文件.api等. 下面整理下python有哪些方式可以读取数据文件. 1. python ...

  4. python装饰器模式带参数_python 装饰器模式 我的理解

    python和javascript类似, 可以把函数当作函数的返回值, 比如 def func(f): def subfunc(): print 'subfunc' return subfunc此外f ...

  5. python 无头模式 绕过检测_Python chrome 无头模式的问题

    如题: 业务需要,需要音频通话,代码如下: ''' chrome_options = Options() # 无头模式启动 chrome_options.add_argument('--headles ...

  6. python读excel 包含格式_python读取excel格式的文件

    使用 xlrd 能够很方便的读取 excel 文件内容,而且这是个跨平台的库,能够在windows,linux/unix,等平台上面使用. 简单例子importxlrd fname = "s ...

  7. python访问组策略_python 组策略

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 增加策略组默认接口请求频率限制:20次秒. 注意:本接口支持金融区地域. 由于金 ...

  8. python计算最大回撤_Python进阶量化交易场外篇3——最大回撤评价策略风险

    新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...

  9. python 天勤 金叉 编程代码_Python量化策略开发框架,固定的套路、突破策略的福音...

    点及财经,股票期货专业投机者. Python量化策略开发框架,固定的套路.突破策略的福音-1.jpg (45.43 KB, 下载次数: 0) 2020-12-29 20:10 上传 前言 策略的触发方 ...

  10. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

最新文章

  1. 轻量应用服务器MySQL远程连接踩坑
  2. 在一个公司死磕了5-10年的人,最后都怎么样了?
  3. 通过javaMail API 发送邮件
  4. 生产者消费者的实际使用
  5. linux 搜索文件名中非,Linux服务器中非 root 用户安装(多版本) CUDA 和 cuDNN
  6. 【已解决】TypeError: bind() takes exactly one argument (2 given)
  7. python布局管理_Python基础=== Tkinter Grid布局管理器详解
  8. 2019年CSDN博客前十排名
  9. 全球顶级开源大神们现身 COSCon‘20
  10. c语言贪吃蛇游戏 vc6,把tc下的贪吃蛇游戏改到vc6下运行
  11. 相克军_Oracle体系_随堂笔记011-事物
  12. 阿里云服务器价格表:第7代云服务器ECS收费价格表
  13. 6款沙发背景墙装饰画 总有一幅你喜欢的
  14. 数据挖掘技术-绘制人口数目直方图
  15. HTML学生个人网站作业设计:电影网站设计——电影购票项目(9页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  16. 第十三届蓝桥杯大赛软件类国赛 C/C++ 大学B组 试题 G: 故障
  17. 7-2 运动会 (10 分)
  18. String类型转Long类型需要注意的问题
  19. GDPR全文翻译(一)
  20. 今天是阳光明媚的一天

热门文章

  1. Oracle sga、pga介绍改动
  2. Silverlight中 非UI线程更新UI 的几种方法
  3. 17.go 面向对象 interface
  4. 26.MySQL 锁
  5. ec2 web mysql_AWS之EC2实例搭建LAMP服务器
  6. IOCAutofac与ORMEntityFramwork的联系--单例模式
  7. CentOS 5.5 使用 EPEL 和 RPMForge 软件库
  8. 全局异常捕捉用法解析
  9. 家庭记账本开发记录(4)
  10. bootstrap基础样式学习(一)