策略模式

示例:

商场收银软件---营业员根据客户所购买商品的单价和数量,向客户收费。

商场会不定期的举行各种活动,如 满100减30, 满200减70, 打8折, 满100积分10点等。

很容易想到用简单工厂模式实现,如下图是简单工厂模式的UML类关系图。

收费类--父类

class CashSuper:

def AcceptCash(self, money):

pass

正常收费子类

class CashNormal(CashSuper):

def AcceptCash(self, money):

return money

折扣收费子类

class CashRebate(CashSuper):

def __init__(self, discount):

self.discount = discount

def AcceptCash(self, money):

return money * self.discount

返利收费子类

class CashReturn(CashSuper):

def __init__(self,mcondition,mreturn):

self.mcondition = mcondition

self.mreturn = mreturn

def AcceptCash(self, money):

if(money >= self.mcondition):

return money - self.mreturn

else:

return money

收费工厂类----

class CashFactory:

CashType = {}

CashType['1'] = CashNormal()

CashType['2'] = CashRebate(0.8)

CashType['3'] = CashReturn(500,100)

def GetResult(self, ch):

if ch in CashType:

op = CashType[ch]

return op

客户端主要程序是

if __name__ == '__main__':

money = raw_input("money is ")

cashtype = raw_input("cash type is : [1] for Normal, [2] for Rebate, [3] for Return ")

cashf = CashFactory()

cash = cashf.GetCashType(cashtype)

print cash.AcceptCash(money)

虽然工厂模式也能解决这个问题,但是工厂模式只能解决对象的创建问题。由于工厂本身包括了所有的收费方式,打折额度和返利方式可能经常变更,每次维护或扩展都要改动这个工厂,以至于代码需要重新部署。

无论是打折还是返利都是商家的促销策略,用工厂模式创建这些策略对象本身没错,这是这些策略相互替代的变化也同样需要封装。

策略模式

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

策略模式分离了对象和其行为,对象根据策略不通,选择组合不同的行为。

用策略模式的UML关系图。

CashContext类

class CashContext:

def __init__(self, csuper): ## 通过构造函数,传入具体的收费策略

self.csuper = csuper

def GetResult(self):

return self.csuper.acceptCash(self, money) ##获得相应收费策略的结果

定义这样纯策略模式的CashContext类对象,会导致要在客户端去决定用哪一种收费策略。我们将策略模式与简单工厂模式结合,将选择收费策略的判断移到CashContext类中。

改进后的CashContext类

class CashContext:

CashStrategys = {}

CashStrategys['1'] = CashNormal()

CashStrategys['2'] = CashRebate()

CashStrategys['3'] = CashReturn()

def __init__(self, cashtype):

if cashtype in CashStrategys:

self.csuper = CashStrategys[cashtype]

def GetResult(self, money):

return self.csuper.acceptCash(self,money)

客户端主要代码:

if __name__ == '__main__':

money = raw_input("money is ")

cashtype = raw_input("cash type is : [1] for Normal, [2] for Rebate, [3] for Return ")

csuper = CashContext(cashtype)

cash = csuper.GetResult(money)

print cash

当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个独立的策略类中,可以在使用这些行为的类中消除条件语句。

只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

python简单的购物程序代码打折_策略模式----商场促销--Python版相关推荐

  1. python简单的购物程序代码-Python实现购物程序思路及代码

    要求: 启动程序后,让用户输入工资,然后打印出带有序号的商品列表 用户输入商品序号购买相应的商品,或者输入 " q " 退出购买界面 选择商品后,检查余额是否足够,够则直接扣款,不 ...

  2. python简单的爬虫程序代码_简单的电子邮件爬虫Python代码

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import requests import re try: from urllib.pa ...

  3. python身份证城市定位程序输入点_有关一道身份证的python编程题

    有关一道身份证的题目,要求python解决 就昨天晚上嗷一个妹纸问我这样一道问题哈: 问题: 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17 ...

  4. java基础代码实例_全网都在找的Python简单基础小程序的实例代码

    这篇文章主要介绍了Python简单基础小程序的实例代码,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下. 1 九九乘法表 3 4 5 6 7for i in range(9):#从0循环到8 ...

  5. python基础代码事例-Python简单基础小程序的实例代码

    1 九九乘法表 for i in range(9):#从0循环到8 i += 1#等价于 i = i+1 for j in range(i):#从0循环到i j += 1 print(j,'*',i, ...

  6. python程序实例教程基础-Python简单基础小程序的实例代码

    1 九九乘法表 for i in range(9):#从0循环到8 i += 1#等价于 i = i+1 for j in range(i):#从0循环到i j += 1 print(j,'*',i, ...

  7. python经典程序实例-Python简单基础小程序的实例代码

    1 九九乘法表 for i in range(9):#从0循环到8 i += 1#等价于 i = i+1 for j in range(i):#从0循环到i j += 1 print(j,'*',i, ...

  8. python简单程序实例-Python简单基础小程序的实例代码

    1 九九乘法表 for i in range(9):#从0循环到8 i += 1#等价于 i = i+1 for j in range(i):#从0循环到i j += 1 print(j,'*',i, ...

  9. python基础编程:Python简单基础小程序的实例代码

    这篇文章主要介绍了Python简单基础小程序的实例代码,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下 1 九九乘法表 for i in range(9):#从0循环到8i += 1#等价于 ...

最新文章

  1. 完美的素数_JAVA
  2. C++知识回顾之__stdcall、__cdcel和__fastcall三者的区别
  3. 常规单元测试和存根–测​​试技术4
  4. 分析.cpp文件编译生成的汇编文件里语句的作用
  5. 使用iozone和bonnie测试磁盘IO
  6. 全球顶尖科学杂志:阿里AI语音技术超越谷歌,可读懂人类潜藏意图
  7. [转]解决IE下CSS背景图片闪烁的Bug
  8. 【Python】体育竞技分析
  9. 七:构造方法与自定义构造方法
  10. 一分钟了解阿里云产品:安骑士
  11. wget 下载文件出错
  12. MATLAB曲线平滑的办法
  13. 项目实战第一讲:如何优雅地记录操作日志
  14. 亿级流量电商JVM调优(转图灵学院)
  15. GitHub 上值得收藏的100个精选前端项目!
  16. Excel常用公式大全
  17. 一图秒懂:打开oracle归档模式,rman备份的前提条件
  18. HDU - 3556 - Continued Fraction
  19. 第六章: Cassandra架构--Cassandra:The Definitive Guide 2nd Edition
  20. 如何将windows安装在移动硬盘上

热门文章

  1. HTML5音乐播放器(最新升级改造加强版)
  2. Redis | 第8章 发布订阅与事务《Redis设计与实现》
  3. 宁可一思进 莫在一思停
  4. zz带领团队发挥最大潜能的10个技巧
  5. 【译文】为什么我在亚马逊工作了5个月之后就离职了
  6. 达芬奇密码 第八十六章
  7. python需要配置环境变量吗_Python环境变量的配置
  8. wrapper.and
  9. 百度“筷搜”真的能查出地沟油吗?
  10. 样本方差是总体方差的无偏估计