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 27 Python
Python 编码Basic Auth使用方法简单实例
May 25 Python
不可错过的十本Python好书
Jul 06 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
Python-openCV读RGB通道图实例
Jan 17 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 Python
Python库安装速度过慢解决方案
Jul 14 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
Python如何让字典保持有序排列
Apr 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下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP基础学习小结
2011/04/17 PHP
php中session与cookie的比较
2015/01/27 PHP
php生成短域名函数
2015/03/23 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
js中数组排序sort方法的原理分析
2014/11/20 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
jquery编写日期选择器
2017/03/16 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
了解重排与重绘
2019/05/29 Javascript
JS随机密码生成算法
2019/09/23 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
Python中int()函数的用法浅析
2017/10/17 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
python爬虫之遍历单个域名
2019/11/20 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
Java面试题:为什么要用Java
2012/05/11 面试题
旅游管理毕业生自荐信
2013/11/05 职场文书
新书吧创业计划书
2014/01/31 职场文书
中青班党性分析材料
2014/02/16 职场文书
公证委托书模板
2014/04/03 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
后勤个人工作总结
2015/02/28 职场文书
优秀党员先进事迹材料2016
2016/02/29 职场文书