Python设计模式之策略模式实例详解

 更新时间:2019年01月21日 14:35:48   作者:Andy冉明  
这篇文章主要介绍了Python设计模式之策略模式,结合实例形式分析了策略模式的概念、原理并结合实例形式分析了Python定义与使用策略模式相关操作技巧,需要的朋友可以参考下

本文实例讲述了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

这几个类的设计如下图:

使用一个策略类CashSuper定义需要的算法的公共接口,定义三个具体策略类:CashNormal,CashRebate,CashReturn,继承于CashSuper,定义一个上下文管理类,接收一个策略,并根据该策略得出结论,当需要更改策略时,只需要在实例的时候传入不同的策略就可以,免去了修改类的麻烦

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • 解决PyCharm无法使用lxml库的问题(图解)

    解决PyCharm无法使用lxml库的问题(图解)

    这篇文章主要介绍了解决PyCharm无法使用lxml库的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 详解Python Selenium如何获取鼠标指向的元素

    详解Python Selenium如何获取鼠标指向的元素

    这篇文章主要介绍了如何通过Selenium获取当前鼠标指向的元素,本文方法的核心,是借助JavaScript的事件(event)来获取鼠标所在的元素,感兴趣的可以试一试
    2022-03-03
  • python 环境变量和import模块导入方法(详解)

    python 环境变量和import模块导入方法(详解)

    下面小编就为大家带来一篇python 环境变量和import模块导入方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Python中Pyspider爬虫框架的基本使用详解

    Python中Pyspider爬虫框架的基本使用详解

    这篇文章主要介绍了Python中Pyspider爬虫框架的基本使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python如何使用PIL Image制作GIF图片

    Python如何使用PIL Image制作GIF图片

    这篇文章主要介绍了Python如何使用PIL Image制作GIF图片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python远程创建docker容器的方法

    Python远程创建docker容器的方法

    这篇文章主要介绍了Python远程创建docker容器的方法,如果docker  ps找不到该容器,可以使用 docker ps -a查看所有的,然后看刚才创建的容器的STATUS是EXIT0还是EXIT1如果是1,那应该是有报错,使用 docker logs 容器id命令来查看日志,根据日志进行解决,需要的朋友可以参考下
    2024-04-04
  • 解决python cv2.imread 读取中文路径的图片返回为None的问题

    解决python cv2.imread 读取中文路径的图片返回为None的问题

    这篇文章主要介绍了解决python cv2.imread 读取中文路径的图片返回为None的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 使用Python实现获取文件详细信息

    使用Python实现获取文件详细信息

    Python提供了丰富的内置模块和函数,获取和操作文件的各种属性信息,比如大小、修改时间、权限以及路径等,本文将通过详细的示例代码展示如何使用Python中的os和os.path模块来获取文件属性信息,需要的可以参考下
    2023-12-12
  • 非常详细的Django连接mysql数据库步骤记录

    非常详细的Django连接mysql数据库步骤记录

    我的Mysql中已经有了项目需要使用的相关数据库,现在需要通过django来获取Mysql里的数据并使用,下面这篇文章主要给大家介绍了关于非常详细的Django连接mysql数据库步骤,需要的朋友可以参考下
    2022-10-10
  • python 日期操作类代码

    python 日期操作类代码

    这篇文章主要介绍了python 日期操作类代码,里面涉及了python日期操作的一些基础知识,需要的朋友可以参考下
    2018-05-05

最新评论