策略模式(Strategy Pattern)

  策略模式是一种与行为相关的设计模式,允许你在运行时根据指定的上下文确定程序的动作。可以在两个类中封装不同的算法,并且在程序运行时确定到底执行哪中策略。

  特点:定义算法家族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化不会影响到使用算法的客户。

  《大话设计模式》中实例:超市收银软件。

  代码:

#!/usr/bin/env python
#-*- coding: utf-8 -*- class CashSuper():
def acceptCash(self):
pass class CashNormal(CashSuper):
def accept(slef,money):
return money class CashRebate(CashSuper):
moneyRebate = 0.0
def __init__(self,rebate):
self.moneyRebate = rebate
def acceptCash(self,money):
return money*self.moneyRebate class CashReturn(CashSuper):
m_moneyCondition = 0.0
m_moneyReturn = 0.0 def __init__(self,moneyCondition,moneyReturn):
self.m_moneyCondition = moneyCondition
self.m_moneyReturn = moneyReturn def acceptCash(self,money):
if(money>self.m_moneyCondition):
result = money - (money/self.m_moneyCondition)*self.m_moneyReturn
else:
result = money
return result class CashContext():
def __init__(self,choice):
self.s_cash = choice
def getCash(self,money):
return self.s_cash.acceptCash(money) if __name__ == "__main__":
money = input("Enter the money:")
strategy = {}
strategy[1] = CashContext(CashNormal)
strategy[2] = CashContext(CashRebate)
strategy[3] = CashContext(CashReturn(300,100)) cash_type = input("Type: [1]for normal; [2]for 80% discount; [3]for 300 - 100.") if(cash_type in strategy.keys()):
cash_strategy = strategy[cash_type]
else:
print(u"未定义的收费模式!使用正常收费!")
cash_strategy = strategy[1]
real_money = cash_strategy.getCash(money) print(u"实际付款:" + str(real_money))
#print("实际付款:%d"%real_money)

  步骤:

  1、定义Strategy类,定义所有支持的算法的公共接口

  2、定义ConcreteStrategy类,封装具体的算法或方法,继承于Strategy类

  3、定义Context类,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。

#!/usr/bin/env python
#-*- coding: utf-8 -*- class Strategy():
def AlgorithmInterface(self):
pass class ConcrateStrategyA(Strategy):
def AlgorithmInterface(self):
print("算法A实现!") class ConcrateStrategyB(Strategy):
def AlgorithmInterface(self):
print("算法B实现!") class ConcrateStrategyC(Strategy):
def AlgorithmInterface(self):
print("算法C实现!") class Context():
def __init__(self,choice):
self.contextsuper = choice def ContextInterface(self):
self.contextsuper.AlgorithmInterface() if __name__ == "__main__":
context = Context(ConcrateStrategyA())
context.ContextInterface() context = Context(ConcrateStrategyB())
context.ContextInterface() context = Context(ConcrateStrategyC())
context.ContextInterface()

Python 设计模式--策略模式的更多相关文章

  1. 大话设计模式Python实现-策略模式

    策略模式(Strategy Pattern):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 下面是一个商场活动的实现 #!/usr/bin/e ...

  2. python实现策略模式

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

  3. 15. 星际争霸之php设计模式--策略模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)

    [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...

  5. linkin大话设计模式--策略模式

    linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi]  策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...

  6. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  7. 浅谈Python设计模式 - 外观模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 外观模式 外观模式的核心在于将复杂的内部实现包装起来,只向外界提供简单的调用接口 ...

  8. 架构师修炼之设计模式 - 策略模式(Strategy) 【Python与C#实现】

    程序员,我为你祝福 愿你有一个灿烂的前程 愿你有情人终成眷属 愿你在尘世获得幸福 我只想成为架构师,走遍江湖! 目录 模式定义 模式分类 模式结构 实例(C#与Python版) 优点 缺点 使用场景 ...

  9. 设计模式-策略模式(Strategy Model)

    1.概述     在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能.     如在人物比较排序的实现中,我们有 ...

随机推荐

  1. Sound Card Chip

      DELL sigmatel stac   Hewlett-packard conexant High Definition Audio chip   lenovo(IBM) Analo Devic ...

  2. socket 由浅入深系列------ 原理(一)

    来自:网络整理 个人觉得写一个网络应用程序没有是一件非常easy的事.其实,我们刚開始的时候总觉得的原则: 建立------>连接套接字------->接受一个连接---->发送数据 ...

  3. MongoDB升级导致启动失败

    起因 最近项目使用MongoDB,但是作为一个技术菜鸟,NoSQL数据库我还真不会用,于是我就在自己的阿里云服务器上安装了一个MongoDB4.0.9. 现象 但是当我使用yum -y update升 ...

  4. java jxl读取excel中Date类型

    Workbook book = Workbook.getWorkbook(excel); Sheet sheet = book.getSheet(0); int clos = sheet.getCol ...

  5. 内容原发网站seo不重视2个标签,导致seo效果不如转发网站

    采集数据,挖掘观点,小心求证,得出结论 时间经过 今日凌晨,爬虫热点采集,其中第一财经是目标站之一,采集到了 http://www.yicai.com/news/5391233.html 谷歌去年悄然 ...

  6. Android源码的下载、编译与导入到Android Studio【转】

    本文转载自:http://wl9739.github.io/2016/05/09/Android%E6%BA%90%E7%A0%81%E7%9A%84%E4%B8%8B%E8%BD%BD%E3%80% ...

  7. 今天要查一下,如果没有密保手机的号码在使用,怎么更换qq的密保手机

    本来我是想是使用284来作为foxmail的一个记事本账号,但是需要验证130的手机,这是以前使用的手机,现在不能接受该短信了,得反馈下.

  8. 【SDOI 2008】 递归数列

    [题目链接] 点击打开链接 [算法] 矩阵乘法优化递推 由于本博客不支持数学公式,所以不能将矩阵画出来,请谅解! [代码] #include<bits/stdc++.h> using na ...

  9. bzoj2763 [JLOI2011]飞行路线——分层图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 构建分层图. 代码如下: 写法1(空间略大)(时间很慢): #include<i ...

  10. Python---scikit-learn(sklearn)模块

    Python在机器学习方面一个非常强力的模块---scikit-learn模块,它作为数据挖掘和数据分析方面的一个简单而有效的工具,主要包括6大功能:分类(Classification),回归(Reg ...