设计模式之策略模式

# -*- 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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值