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设计模式之单例模式实例
Apr 26 Python
对于Python的Django框架部署的一些建议
Apr 09 Python
python实现感知器
Dec 19 Python
Python中的元组介绍
Jan 28 Python
解决django前后端分离csrf验证的问题
Feb 03 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
Pytorch中实现只导入部分模型参数的方式
Jan 02 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
python中前缀运算符 *和 **的用法示例详解
May 28 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 Python
聊一聊python常用的编程模块
May 14 Python
Python OpenCV实现图形检测示例详解
Apr 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
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
IE php关于强制下载文件的代码
2008/08/23 Javascript
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
js正确获取元素样式详解
2009/08/07 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
2019/04/16 jQuery
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
python3编码问题汇总
2016/09/06 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
Python的缺点和劣势分析
2019/11/19 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
详解python logging日志传输
2020/07/01 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
介绍一下linux的文件权限
2014/07/20 面试题
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
微观物理专业自荐信
2014/01/26 职场文书
培训班开班仪式主持词
2014/03/28 职场文书
国庆宣传标语
2014/06/30 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers