python简单的购物程序代码打折_策略模式----商场促销--
Python版
策略模式
⽰例:
商场收银软件---营业员根据客户所购买商品的单价和数量,向客户收费。
商场会不定期的举⾏各种活动,如 满100减30, 满200减70, 打8折, 满100积分10点等。
很容易想到⽤简单⼯⼚模式实现,如下图是简单⼯⼚模式的UML类关系图。
收费类--⽗类
class CashSuper:
def AcceptCash(self, money):
pass
正常收费⼦类
class CashNormal(CashSuper):
def AcceptCash(self, money):
return money
折扣收费⼦类
class CashRebate(CashSuper):
def __init__(self, discount):
self.discount = discount
def AcceptCash(self, money):
return money * self.discount
返利收费⼦类
class CashReturn(CashSuper):
def __init__(self,mcondition,mreturn):
def AcceptCash(self, money):
if(money >= dition):
return money - urn
else:
return money
收费⼯⼚类----
class CashFactory:
CashType = {}
CashType['1'] = CashNormal()
CashType['2'] = CashRebate(0.8)
CashType['3'] = CashReturn(500,100)
def GetResult(self, ch):
if ch in CashType:
op = CashType[ch]
return op
客户端主要程序是
if __name__ == '__main__':
money = raw_input("money is ")
cashtype = raw_input("cash type is : [1] for Normal, [2] for Rebate, [3] for Return ")
cashf = CashFactory()
cash = cashf.GetCashType(cashtype)
print cash.AcceptCash(money)
虽然⼯⼚模式也能解决这个问题,但是⼯⼚模式只能解决对象的创建问题。由于⼯⼚本⾝包括了所有的收费⽅式,打折额度和返利⽅式可能经常变更,每次维护或扩展都要改动这个⼯⼚,以⾄于代码需要重新部署。
⽆论是打折还是返利都是商家的促销策略,⽤⼯⼚模式创建这些策略对象本⾝没错,这是这些策略相互替代的变化也同样需要封装。
策略模式
它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使⽤算法的客户。
策略模式分离了对象和其⾏为,对象根据策略不通,选择组合不同的⾏为。
⽤策略模式的UML关系图。
CashContext类
class CashContext:
def __init__(self, csuper): ## 通过构造函数,传⼊具体的收费策略
self.csuper = csuper
def GetResult(self):
return self.csuper.acceptCash(self, money) ##获得相应收费策略的结果
定义这样纯策略模式的CashContext类对象,会导致要在客户端去决定⽤哪⼀种收费策略。我们将策略模式与简单⼯⼚模式结合,将选择收费策略的判断移到CashContext类中。
python单例模式改进后的CashContext类
class CashContext:
CashStrategys = {}
CashStrategys['1'] = CashNormal()
CashStrategys['2'] = CashRebate()
CashStrategys['3'] = CashReturn()
def __init__(self, cashtype):
if cashtype in CashStrategys:
self.csuper = CashStrategys[cashtype]
def GetResult(self, money):
return self.csuper.acceptCash(self,money)
客户端主要代码:
if __name__ == '__main__':
money = raw_input("money is ")
cashtype = raw_input("cash type is : [1] for Normal, [2] for Rebate, [3] for Return ")
csuper = CashContext(cashtype)
cash = csuper.GetResult(money)
print cash
当不同的⾏为堆砌在⼀个类中时,就很难避免使⽤条件语句来选择合适的⾏为。将这些⾏为封装在⼀个个独⽴的策略类中,可以在使⽤这些⾏为的类中消除条件语句。
只要在分析过程中听到需要在不同时间应⽤不同的业务规则,就可以考虑使⽤策略模式处理这种变化的可能性。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论