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使用urllib2模块获取gravatar头像实例
Dec 18 Python
python与php实现分割文件代码
Mar 06 Python
基于python3 OpenCV3实现静态图片人脸识别
May 25 Python
Python socket实现多对多全双工通信的方法
Feb 13 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
Python生成器的使用方法和示例代码
Mar 04 Python
python3实现的zip格式压缩文件夹操作示例
Aug 17 Python
python sklearn常用分类算法模型的调用
Oct 16 Python
配置python的编程环境之Anaconda + VSCode的教程
Mar 29 Python
Python中有几个关键字
Jun 04 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
Jun 08 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
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
js+css在交互上的应用
2010/07/18 Javascript
jquery的键盘事件修改代码
2011/02/24 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
详解JavaScript正则表达式之分组匹配及反向引用
2016/03/09 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
[35:26]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第三局
2016/02/26 DOTA
django 创建过滤器的实例详解
2017/08/14 Python
python中利用Future对象回调别的函数示例代码
2017/09/07 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
大学生创业计划书
2014/08/14 职场文书
单位在职证明书
2014/09/11 职场文书
西双版纳导游词
2015/02/03 职场文书
情人节单身感言
2015/08/03 职场文书
欢送领导祝酒词
2015/08/12 职场文书
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫