# -*- coding: utf-8 -*-
"""
这是策略模式的一个应用场景(参考了《大话设计模式》)。
高质量程序:
简洁、可维护、可扩展、可复用。
此处使用了一个上下文类,作为后台与客户端的中间人,这样一来当客户需要修改优惠策略时只
修改上下类中的优惠策略选项即可,故程序具有可维护性;如果需要添加新的优惠策略,只需要
添加新的具体策略类即可,故程序具有可扩展性。
note:
1.策略模式,它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变
化,不会影响到使用算法的客户。(《设计模式》)
2.只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这
种变化的可能性。(《设计模式解析》)
疑问:
1.策略模式和简单工厂模式有什么区别?
"""
from abc import ABCMeta, abstractmethod
#这是一个策略抽象类
class Discount(object):
__classmeta__ = ABCMeta
@abstractmethod
def getResult():
pass
#这是具体的优惠策略类,实现打折优惠。
class DiscountA(Discount):
def __init__(self, rate=0.8):
self.rate = rate
def getResult(self, money):
return money*self.rate
#这是具体的优惠策略类,实现满M送N,即购满M元,返N元。
class DiscountB(Discount):
def __init__(self, m=300, n=100):
self.m = m
self.n = n
def getResult(self, money):
i = 0
temp = money
while(temp>=self.m):
temp -= self.m
i += 1
return (money - i*self.n)
#上下文类,用于后台与客户的交互,降低客户与后台算法的耦合度
class Context(object):
dic = {'A':DiscountA(), 'B':DiscountB()}
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Context, cls).__new__(
cls, *args, **kwargs)
return cls._instance
def getResult(cls, strategy, money):
return cls.dic[strategy].getResult(money)
#Client
if __name__ == '__main__':
money = 1000
con = Context()
resultA = con.getResult('A', money)
print resultA
resultB = con.getResult('B', money)
print resultB
设计模式之策略模式
最新推荐文章于 2023-04-07 16:04:17 发布