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实现类继承实例
Jul 04 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
Mar 19 Python
Python使用Flask框架获取当前查询参数的方法
Mar 21 Python
python在windows下创建隐藏窗口子进程的方法
Jun 04 Python
5种Python单例模式的实现方式
Jan 14 Python
python条件变量之生产者与消费者操作实例分析
Mar 22 Python
Python实现输出某区间范围内全部素数的方法
May 02 Python
python使用Matplotlib画饼图
Sep 25 Python
kafka-python批量发送数据的实例
Dec 27 Python
python多线程同步实例教程
Aug 11 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
Jul 14 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+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
php面向对象程序设计中self与static的区别分析
2019/05/21 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
JavaScript 直接操作本地文件的实现代码
2009/12/01 Javascript
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
JavaScript中setInterval的用法总结
2013/11/20 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
2017/02/07 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
Python 第一步 hello world
2009/09/25 Python
Python判断操作系统类型代码分享
2014/11/22 Python
Python实现一个简单的MySQL类
2015/01/07 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
python Flask实现restful api service
2017/12/04 Python
单链表反转python实现代码示例
2018/02/08 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
应届生新闻编辑求职信
2013/11/19 职场文书
酒店总经理助理职责
2014/02/12 职场文书
餐厅执行经理岗位职责范本
2014/02/26 职场文书
2014年车间主任工作总结
2014/12/10 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers