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中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
python中的字典使用分享
Jul 31 Python
Python爬取当当、京东、亚马逊图书信息代码实例
Dec 09 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
Python中的元组介绍
Jan 28 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
基于python修改srt字幕的时间轴
Feb 03 Python
Python实战之实现简易的学生选课系统
May 25 Python
python turtle绘图
May 04 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
Search Engine Friendly的URL设计
2006/10/09 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
JavaScript中null与undefined分析
2009/07/25 Javascript
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
javascript常用函数(2)
2015/11/05 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
jQuery仿写百度百科的目录树
2017/01/03 Javascript
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
JavaScript之Map和Set_动力节点Java学院整理
2017/06/29 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
详解python的argpare和click模块小结
2019/03/31 Python
python怎么自定义捕获错误
2020/06/29 Python
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
幼儿园庆六一游园活动方案
2014/01/29 职场文书
招商专员岗位职责
2014/02/08 职场文书
护士求职信范文
2014/05/24 职场文书
银行求职自荐信
2014/06/30 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
学校运动会报道稿
2014/09/23 职场文书
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
大班上学期个人总结
2015/02/13 职场文书
参加招聘会后的感想
2015/08/10 职场文书
高一语文教学反思
2016/02/16 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL