策略方法 - Python设计模式
策略方法是行为设计模式,它允许您定义完整的算法系列,封装每一个并将它们中的每一个放入单独的类中,并且还允许在那里交换对象。它是在Python中通过将类内定义的方法的内容动态替换为类外定义的函数的内容来实现的。它可以在运行时选择算法。这种方法也称为策略方法。
不使用策略方法的问题
假设您为百货商店创建了一个应用程序。看起来很简单?最初,只有一种折扣,称为 On-Sale-Discount。所以。一切都很顺利,为开发人员维护这样一个简单的应用程序没有任何困难,但随着时间的推移,百货商店的老板要求也为客户提供一些其他类型的折扣。进行这些更改说起来很容易,但以有效的方式实施这些更改绝对不是一件容易的事。
使用策略方法的解决方案
让我们看看如何以有效的方式解决上述问题。我们可以创建一个特定的类,它将所有算法提取到称为Strategy的单独类中。 Out 实际类应该存储对策略类之一的引用。
Python3
"""A separate class for Item"""
class Item:
"""Constructor function with price and discount"""
def __init__(self, price, discount_strategy = None):
"""take price and discount strategy"""
self.price = price
self.discount_strategy = discount_strategy
"""A separate function for price after discount"""
def price_after_discount(self):
if self.discount_strategy:
discount = self.discount_strategy(self)
else:
discount = 0
return self.price - discount
def __repr__(self):
statement = "Price: {}, price after discount: {}"
return statement.format(self.price, self.price_after_discount())
"""function dedicated to On Sale Discount"""
def on_sale_discount(order):
return order.price * 0.25 + 20
"""function dedicated to 20 % discount"""
def twenty_percent_discount(order):
return order.price * 0.20
"""main function"""
if __name__ == "__main__":
print(Item(20000))
"""with discount strategy as 20 % discount"""
print(Item(20000, discount_strategy = twenty_percent_discount))
"""with discount strategy as On Sale Discount"""
print(Item(20000, discount_strategy = on_sale_discount))
输出:
Price: 20000, price after discount: 20000
Price: 20000, price after discount: 16000.0
Price: 20000, price after discount: 14980.0
类图
以下是策略方法的类图
好处
- 开放/封闭原则:在不改变客户代码的情况下引入新策略总是很容易。
- 隔离:我们可以将算法的具体实现细节从客户端的代码中隔离出来。
- 封装:用于实现算法的数据结构完全封装在 Strategy 类中。因此,可以在不影响 Context 类的情况下更改算法的实现
- 运行时切换:应用程序可以在运行时切换策略。
缺点
- 创建额外对象:在大多数情况下,应用程序使用所需的策略对象配置上下文。因此,应用程序需要创建和维护两个对象来代替一个对象。
- 客户之间的意识:客户之间应该清楚策略之间的差异,以便能够为他们选择最好的策略。
- 增加了复杂性:当我们只有少数几个算法要实现时,那么实现 Strategy 方法就很浪费资源。
适用性
- Lot of Similar Classes:当我们有很多执行方式不同的相似类时,这种方法是非常受欢迎的。
- 征服隔离:一般用于将类的业务逻辑与算法实现隔离开来。
进一步阅读Java中的策略方法