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日志模块logging简介
Apr 13 Python
Python中自定义函数的教程
Apr 27 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
分分钟入门python语言
Mar 20 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
python提取具有某种特定字符串的行数据方法
Dec 11 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
python实现电子书翻页小程序
Jul 23 Python
PIL对上传到Django的图片进行处理并保存的实例
Aug 07 Python
python实现简易学生信息管理系统
Apr 05 Python
python numpy--数组的组合和分割实例
Feb 24 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
Dec 10 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集成FCK的函数代码
2008/09/27 PHP
php 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
python实现巡检系统(solaris)示例
2014/04/02 Python
pycharm 使用心得(一)安装和首次使用
2014/06/05 Python
分享15个最受欢迎的Python开源框架
2014/07/13 Python
Python二分查找详解
2015/09/13 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
Python configparser模块应用过程解析
2020/08/14 Python
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
一份软件工程师的面试试题
2016/02/01 面试题
小学生打架检讨书
2014/01/26 职场文书
维稳工作情况汇报
2014/10/27 职场文书
Nginx反向代理学习实例教程
2021/10/24 Servers