Python设计模式中的行为型策略模式
作者:范桂飓 发布时间:2023-02-28 17:04:25
标签:Python,设计模式,策略模式
一、策略模式
策略模式中,首先定义了一系列不同的算法,并把它们一一封装起来,然后在策略类中,使这些算法可以相互替换。这意味着,让一个类的行为(算法)可以在类的实例化对象运行时进行更改。
优点:
定义了一系列可重用的算法和行为。
消除了一些条件语句。
可以提供相同行为的不同实现。
缺点:
Client
必须了解不同的策略行为细节。
二、应用场景
根据不同的客户属性,采用不同的折扣策略来计算订单中的商品价格:
有 1000 或以上积分的客户,每个订单享 5% 折扣。
同一订单中,单个商品的数量达到 20 个或以上,享 10% 折扣。
订单中的不同商品达到 10 个或以上,享 7% 折扣。
三、代码示例
实体角色:
上下文(Context):集成了算法的类。
抽象策略(Strategy):实现不同算法的组件的共同接口。
具体策略(Concrete Strategy):抽象策略的具体子类。
import abc
# 抽象策略
class Strategy(metaclass=abc.ABCMeta):
@abc.abstractmethod
def execute(self, data):
pass
# 具体策略 1
class Strategy1(Strategy):
def execute(self, data):
print(f"使用策略1执行{data}")
# 具体策略2
class Strategy2(Strategy):
def execute(self, data):
print(f"使用策略2执行{data}")
# 上下文
class Context:
def __init__(self, data):
self.strategy = None
self.data = data
def set_strategy(self, strategy):
self.strategy = strategy
def do_strategy(self):
if self.strategy:
self.strategy.execute(self.data)
else:
print("请先配置策略!")
if __name__ == "__main__":
data = "测试数据"
s1 = Strategy1()
s2 = Strategy2()
context = Context(data)
context.set_strategy(s1)
context.do_strategy()
context.set_strategy(s2)
context.do_strategy()
来源:https://is-cloud.blog.csdn.net/article/details/122929628


猜你喜欢
- 本文实例讲述了Python基于csv模块实现读取与写入csv数据的方法。分享给大家供大家参考,具体如下:通过csv模块可以轻松读取格式为cs
- 训练keras时遇到了一个问题,就是内存不足,将 .fit 改成 .fit_generator以后还是放不下一张图(我的图片是8192×81
- Python生成指定数量的优惠码打开Python开发工具IDLE,新建‘codeGen.py'文件,并保存导入需要的包,这里需要ra
- view()函数是在torch.Tensor.view()下的一个函数,可以有tensor调用,也可以有variable调用。其作用在于返回
- overflow:hidden 用在div上时很好用,但直接用在td上,好像没有任何效果。td中的文本过长时依然自动换了一行像下面这要设定一
- 本文实例讲述了golang image图片处理方法。分享给大家供大家参考,具体如下:golang处理图片挺简单的,我是过功能挺简单的,没有过
- 本文为大家讲解了pytorch实现CNN卷积神经网络,供大家参考,具体内容如下我对卷积神经网络的一些认识卷积神经网络是时下最为流行的一种深度
- 本代码主要实现的是利用网络传输图片,用在我的树莓派项目之上。该项目在PC上运行服务端,树莓派上运行客户端,两者连接到同一局域网中,修改代码中
- 这篇文章不谈大道理,只谈细节。关于facebook的大道理,大家可以去海内网的帖子《谁去救救麦田老师吧》讨论。那里有很多IT评论高手,谈的很
- 修改配置文件:vim /usr/local/php/etc/php.ini[Phar]phar.readonly = Off压缩:a. 创建
- 从MySQL 5.0.2开始,通过mysql_stmt_attr_set() C API函数实现了服务器端光标。服务器端光标允许在服务器端生
- 查询速度慢的原因很多,常见如下几种:1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2、I/O吞吐量小,形成了瓶颈效
- 比如有两个模块,一个aa.py,一个bb.py 代码如下:aa.py:#encoding:utf-8import bba=1bb.py:#e
- 1、在模块中,我们需要判断__name__是否被赋值为“__main__”。python fibo.py <arguments>
- 需求描述制作一个H5页面,打开之后可以录音,并将录音文件提交至后台微信录音最长时长为1min微信官方文档--音频接口代码如下 /
- numpy模块下的median作用为: 计算沿指定轴的中位数返回数组元素的中位数其函数接口为:median(a, axis=None, ou
- 如何下载最新版本的MySQL?我先去MySQL首页下载最新版本的MySQL-链接:https://www.mysql.com/downloa
- 随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript
- 现在我们已经知道了,fixtures是一个非常强大的功能。那么有的时候,我们可能会写一个fixture,而这个fixture所有的测试函数都
- 建议用pycharm,使用比较方便,并且可以直接编辑html文件import timelocatime = time.strftime(&q