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标准库之循环器(itertools)介绍
Nov 25 Python
python实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
基于MTCNN/TensorFlow实现人脸检测
May 24 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
pytorch 修改预训练model实例
Jan 18 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
Sep 21 Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 Python
利用Python实现模拟登录知乎
May 25 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
jquery 最简单的属性菜单
2009/10/08 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
JavaScript对象创建及继承原理实例解剖
2013/02/28 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
2017/01/06 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python实现处理逆波兰表达式示例
2018/07/30 Python
使用python绘制二元函数图像的实例
2019/02/12 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
2019年c语言经典面试题目
2016/08/17 面试题
制定岗位职责的原则
2013/11/08 职场文书
英文简历自荐信范文
2013/12/11 职场文书
运动会获奖感言
2014/02/11 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA