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中的多重继承实例讲解
Sep 28 Python
浅谈python中的getattr函数 hasattr函数
Jun 14 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
Python SQLite3数据库日期与时间常见函数用法分析
Aug 14 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
python实现Decorator模式实例代码
Feb 09 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
Pandas 按索引合并数据集的方法
Nov 15 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
关于python pycharm中输出的内容不全的解决办法
Jan 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 高性能书写
2010/12/11 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
php批量修改表结构实例
2017/05/24 PHP
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
python实现查询苹果手机维修进度
2015/03/16 Python
python 判断是否为正小数和正整数的实例
2017/07/23 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
使用Python写一个量化股票提醒系统
2018/08/22 Python
numpy基础教程之np.linalg
2019/02/12 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
T3官网:头发造型工具
2019/12/26 全球购物
求职推荐信
2013/10/28 职场文书
学生会干部自荐信
2014/02/04 职场文书
质检部经理岗位职责
2014/02/19 职场文书
初中英语演讲稿
2014/04/29 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js