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正则表达式的使用
Jun 12 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
终端命令查看TensorFlow版本号及路径的方法
Jun 13 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
使用python验证代理ip是否可用的实现方法
Jul 25 Python
python-opencv颜色提取分割方法
Dec 08 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
详解程序意外中断自动重启shell脚本(以Python为例)
Jul 26 Python
使用pth文件添加Python环境变量方式
May 26 Python
python交互模式基础知识点学习
Jun 18 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 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缓存设计实现代码
2011/09/30 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
js实现图片3D轮播效果
2019/09/21 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
keras 权重保存和权重载入方式
2020/05/21 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
家庭教育先进个人事迹材料
2014/01/24 职场文书
小学家长评语大全
2014/04/16 职场文书
防灾减灾标语
2014/10/07 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
公司备用金管理制度
2015/08/04 职场文书
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android