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读取Android permission文件
Nov 01 Python
python冒泡排序算法的实现代码
Nov 21 Python
Python中的exec、eval使用实例
Sep 23 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
Jun 13 Python
详解Python的Lambda函数与排序
Oct 25 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
Python numpy实现二维数组和一维数组拼接的方法
Jun 05 Python
python执行精确的小数计算方法
Jan 21 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
python添加菜单图文讲解
Jun 04 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 Python
详解Python函数print用法
Jun 18 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
处理单名多值表单的详解
2013/06/08 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
Javascript 面向对象 重载
2010/05/13 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
django基础之数据库操作方法(详解)
2017/05/24 Python
python批量爬取下载抖音视频
2019/06/17 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
详解Python高阶函数
2020/08/15 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
旅游管理实习自我鉴定
2013/09/29 职场文书
思想政治教育专业个人求职信范文
2013/12/20 职场文书
党员一句话承诺大全
2014/03/28 职场文书
关于爱国的演讲稿
2014/05/07 职场文书