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装饰器验证配置文件示例
Feb 24 Python
python中list列表的高级函数
May 17 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
Jul 24 Python
numpy matrix和array的乘和加实例
Jun 28 Python
Django csrf 两种方法设置form的实例
Feb 03 Python
Python实现堡垒机模式下远程命令执行操作示例
May 09 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
Keras在训练期间可视化训练误差和测试误差实例
Jun 16 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 Python
浅谈python 类方法/静态方法
Sep 18 Python
python查询MySQL将数据写入Excel
Oct 29 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
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
Thinkphp实现MySQL读写分离操作示例
2014/06/25 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
详解php中 === 的使用
2016/10/24 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
php微信公众号开发之简答题
2018/10/20 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
Angular 表单控件示例代码
2017/06/26 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
python取均匀不重复的随机数方式
2019/11/27 Python
零基础小白多久能学会python
2020/06/22 Python
python dict如何定义
2020/09/02 Python
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
北京某科技有限公司C# .net笔试题
2014/09/27 面试题