Python设计模式之策略模式实例详解


Posted in Python onJanuary 21, 2019

本文实例讲述了Python设计模式之策略模式。分享给大家供大家参考,具体如下:

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

下面是一个商场活动的实现

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Andy'
'''
大话设计模式
设计模式——策略模式
策略模式(strategy):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户
'''
#现金收费抽象类
class CashSuper(object):
  def accept_cash(self,money):
    pass
#正常收费子类
class CashNormal(CashSuper):
  def accept_cash(self,money):
    return money
#打折收费子类
class CashRebate(CashSuper):
  def __init__(self,discount=1):
    self.discount = discount
  def accept_cash(self,money):
    return money * self.discount
#返利收费子类
class CashReturn(CashSuper):
  def __init__(self,money_condition=0,money_return=0):
    self.money_condition = money_condition
    self.money_return = money_return
  def accept_cash(self,money):
    if money>=self.money_condition:
      return money - (money / self.money_condition) * self.money_return
    return money
#具体策略类
class Context(object):
  def __init__(self,csuper):
    self.csuper = csuper
  def GetResult(self,money):
    return self.csuper.accept_cash(money)
if __name__ == '__main__':
  money = input("原价: ")
  strategy = {}
  strategy[1] = Context(CashNormal())
  strategy[2] = Context(CashRebate(0.8))
  strategy[3] = Context(CashReturn(100,10))
  mode = input("选择折扣方式: 1) 原价 2) 8折 3) 满100减10: ")
  if mode in strategy:
    csuper = strategy[mode]
  else:
    print "不存在的折扣方式"
    csuper = strategy[1]
  print "需要支付: ",csuper.GetResult(money)

运行结果:

原价: 500
选择折扣方式: 1) 原价 2) 8折 3) 满100减10: 2
需要支付:  400.0

这几个类的设计如下图:

Python设计模式之策略模式实例详解

使用一个策略类CashSuper定义需要的算法的公共接口,定义三个具体策略类:CashNormal,CashRebate,CashReturn,继承于CashSuper,定义一个上下文管理类,接收一个策略,并根据该策略得出结论,当需要更改策略时,只需要在实例的时候传入不同的策略就可以,免去了修改类的麻烦

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
简单介绍Python中的floor()方法
May 15 Python
在Django中管理Users和Permissions以及Groups的方法
Jul 23 Python
Python实现自动上京东抢手机
Feb 06 Python
Django csrf 两种方法设置form的实例
Feb 03 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
python hashlib加密实现代码
Oct 17 Python
python3.8下载及安装步骤详解
Jan 15 Python
基于python3的socket聊天编程
Feb 17 Python
keras的load_model实现加载含有参数的自定义模型
Jun 22 Python
python判断元素是否存在的实例方法
Sep 24 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 Python
Python 中的单分派泛函数你真的了解吗
Jun 22 Python
Python设计模式之装饰模式实例详解
Jan 21 #Python
python利用Tesseract识别验证码的方法示例
Jan 21 #Python
对python过滤器和lambda函数的用法详解
Jan 21 #Python
利用Python正则表达式过滤敏感词的方法
Jan 21 #Python
Python 实现王者荣耀中的敏感词过滤示例
Jan 21 #Python
opencv python统计及绘制直方图的方法
Jan 21 #Python
python numpy 按行归一化的实例
Jan 21 #Python
You might like
深入extjs与php参数交互的详解
2013/06/25 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
js 自定义的联动下拉框
2010/02/07 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
js 链式延迟执行DOME
2012/01/04 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
2015/05/12 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
Python常用模块介绍
2014/11/21 Python
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
在Python中处理XML的教程
2015/04/29 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
详解python Todo清单实战
2018/11/01 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
战友聚会邀请函
2014/01/18 职场文书
人事主管岗位职责
2014/01/30 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
2014年班干部工作总结
2014/11/25 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
护理工作个人总结
2015/03/03 职场文书
js Proxy的原理详解
2021/05/25 Javascript