Python 设计模式--策略模式
策略模式(Strategy Pattern)
策略模式是一种与行为相关的设计模式,允许你在运行时根据指定的上下文确定程序的动作。可以在两个类中封装不同的算法,并且在程序运行时确定到底执行哪中策略。
特点:定义算法家族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化不会影响到使用算法的客户。
《大话设计模式》中实例:超市收银软件。
代码:
#!/usr/bin/env python
#-*- coding: utf-8 -*- class CashSuper():
def acceptCash(self):
pass class CashNormal(CashSuper):
def accept(slef,money):
return money class CashRebate(CashSuper):
moneyRebate = 0.0
def __init__(self,rebate):
self.moneyRebate = rebate
def acceptCash(self,money):
return money*self.moneyRebate class CashReturn(CashSuper):
m_moneyCondition = 0.0
m_moneyReturn = 0.0 def __init__(self,moneyCondition,moneyReturn):
self.m_moneyCondition = moneyCondition
self.m_moneyReturn = moneyReturn def acceptCash(self,money):
if(money>self.m_moneyCondition):
result = money - (money/self.m_moneyCondition)*self.m_moneyReturn
else:
result = money
return result class CashContext():
def __init__(self,choice):
self.s_cash = choice
def getCash(self,money):
return self.s_cash.acceptCash(money) if __name__ == "__main__":
money = input("Enter the money:")
strategy = {}
strategy[1] = CashContext(CashNormal)
strategy[2] = CashContext(CashRebate)
strategy[3] = CashContext(CashReturn(300,100)) cash_type = input("Type: [1]for normal; [2]for 80% discount; [3]for 300 - 100.") if(cash_type in strategy.keys()):
cash_strategy = strategy[cash_type]
else:
print(u"未定义的收费模式!使用正常收费!")
cash_strategy = strategy[1]
real_money = cash_strategy.getCash(money) print(u"实际付款:" + str(real_money))
#print("实际付款:%d"%real_money)
步骤:
1、定义Strategy类,定义所有支持的算法的公共接口
2、定义ConcreteStrategy类,封装具体的算法或方法,继承于Strategy类
3、定义Context类,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。
#!/usr/bin/env python
#-*- coding: utf-8 -*- class Strategy():
def AlgorithmInterface(self):
pass class ConcrateStrategyA(Strategy):
def AlgorithmInterface(self):
print("算法A实现!") class ConcrateStrategyB(Strategy):
def AlgorithmInterface(self):
print("算法B实现!") class ConcrateStrategyC(Strategy):
def AlgorithmInterface(self):
print("算法C实现!") class Context():
def __init__(self,choice):
self.contextsuper = choice def ContextInterface(self):
self.contextsuper.AlgorithmInterface() if __name__ == "__main__":
context = Context(ConcrateStrategyA())
context.ContextInterface() context = Context(ConcrateStrategyB())
context.ContextInterface() context = Context(ConcrateStrategyC())
context.ContextInterface()
Python 设计模式--策略模式的更多相关文章
- 大话设计模式Python实现-策略模式
策略模式(Strategy Pattern):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 下面是一个商场活动的实现 #!/usr/bin/e ...
- python实现策略模式
python实现策略模式 原文地址 1.策略模式概述 策略模式:定义一系列算法,把它们一一封装起来,并且使它们之间可以相互替换.此模式让算法的变化不会影响到使用算法的客户. 电商领域有个使用“策略”模 ...
- 15. 星际争霸之php设计模式--策略模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)
[.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
- 浅谈Python设计模式 - 外观模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 外观模式 外观模式的核心在于将复杂的内部实现包装起来,只向外界提供简单的调用接口 ...
- 架构师修炼之设计模式 - 策略模式(Strategy) 【Python与C#实现】
程序员,我为你祝福 愿你有一个灿烂的前程 愿你有情人终成眷属 愿你在尘世获得幸福 我只想成为架构师,走遍江湖! 目录 模式定义 模式分类 模式结构 实例(C#与Python版) 优点 缺点 使用场景 ...
- 设计模式-策略模式(Strategy Model)
1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有 ...
随机推荐
- Lua迭代器
在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素.迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,可以通过闭包提供的机制来实现这个任务(闭包中的外部局部变量可以用 ...
- 【转】配置windows路由表,使电脑同时连接内网外网方法
1. 公司内部,内网和外网的网关不一样,怎么样让电脑可以同时上内网和外网呢? 来一张不相关的磁盘结构图: ----------------------------------------------- ...
- <a href="javascript:;"></a>
有时会在网页a标签中看到这样的代码,比如: <a href="javascript:;">反选</a> 这是啥意思呢? 我们知道标签的 href属性用于指定 ...
- C#如何开发多语言支持的Winform程序
C# Winform项目多语言实现(支持简/繁/英三种语言)有很多种方案实现多语言,我在这里介绍一种最简单最容易理解的,作为教学材题应该从通俗易懂入手.在写这篇文章之前,本来想用枚举窗体对象成员的方式 ...
- VC++ 提示无法打开包括文件“iostream.h”怎么办
把 //#include "iostream.h" 改成 #include<iostream> using namespace std; ...
- Mysql数据库再度使用
查看数据库端口: show global variables like 'port'; 谨记:每一条sql结束的语句后都要接上分号. 在连接数据库时遇到过这种问题: Fatal error: Call ...
- ATM取款机模拟——数据结构课设
今天帮人写的第二篇课设 . ;-) 机智的窝 要求:大概说一下吧,就是要创建一个用户(初始化一账户),模拟ATM的业务(取款,100的整数倍,改密 码,查剩余金额.等等,各 ...
- 项目实战之poi导出excel
所需jar包 官方下载地址:http://mirrors.hust.edu.cn/apache/poi/release/bin/poi-bin-3.17-20170915.zip 1.前端调用方法: ...
- Hihocoder #1479 : 三等分 树形DP
三等分 描述 小Hi最近参加了一场比赛,这场比赛中小Hi被要求将一棵树拆成3份,使得每一份中所有节点的权值和相等. 比赛结束后,小Hi发现虽然大家得到的树几乎一模一样,但是每个人的方法都有所不同.于 ...
- Codeforces Round #311 (Div. 2) D - Vitaly and Cycle
D. Vitaly and Cycle time limit per test 1 second memory limit per test 256 megabytes input standard ...