#策略模式strategy
#概念定义:定义一系列算法,把他们一个个封装起来,并且使他们之间可以互相替换,从而让算法可以独立于使用它的用户而变化
#适用范围:不同时间应用不同业务规则的情况

#超市促销打折,周年庆可能搞部分商品打折,部分商品满减,部分商品积分,等活动
#计算最终价格
class Discount(object): #优惠计算抽象类
    finalPrice = 0
    def calc(self,currentPrice):
        raise Exception('子类未实现该方法')

class Normal(Discount):#正常收费
    def calc(self,currentPrice):
        self.finalPrice = currentPrice
        return self.finalPrice

class Reduce(Discount):#打折
    reduceNum = 1.0 #打折数
    def setReduceNum(self,num):
        self.reduceNum = num
    def calc(self,currentPrice,):
        self.finalPrice = currentPrice*self.reduceNum
        return self.finalPrice

class Fullreduce(Discount): #满减
    fullPrice = 0
    returnPrice = 0
    def setFullAndReturnPrice(self,fullPrice,returnPrice):
        self.fullPrice = fullPrice
        self.returnPrice = returnPrice
    def calc(self,currentPrice):
        if currentPrice>=self.fullPrice:
            self.finalPrice = currentPrice-self.returnPrice
        else:
            self.finalPrice = self.fullPrice
        return self.finalPrice

class Context(object): #context
    def __init__(self,type):
        self.discount1 = Factory().getDiscount(type)

    def calcExec(self,currentPrice):
        return self.discount1.calc(currentPrice)

class Factory: #与简单工厂相结合
    discount = None
    def getDiscount(self,type):
        if type=='正常':
            self.discount = Normal()
        elif type == '打折':
            self.discount = Reduce()
        elif type == '满减':
            self.discount = Fullreduce()
        return self.discount

if __name__ == '__main__':
    context = Context('打折')
    context.discount1.setReduceNum(0.7)
    print(context.calcExec(500))

posted on 2020-11-01 17:35  94小渣渣  阅读(75)  评论(0编辑  收藏  举报