Tags: Python, 设计模式, 策略模式
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。 ——《设计模式》 GoF
条件判断语句
的代码通常都需要Strategy模式。StrategyBase
只放一个算法的实现,当然特殊情况,也可以放多个相关的算法实现。原始的代码中,当随着业务的需要,需要支持新的货币,比如韩元、日元,那么就需要修改枚举,添加elif
。违背了开闭原则。
# -*- coding:utf-8 -*-
from enum import Enum, unique
@unique
class TaxType(Enum):
CN_TAX = 0
US_TAX = 1
DE_TAX = 2
class SalesOrder(object):
def calculate_tax(self, tax_type):
if tax_type == TaxType.CN_TAX:
self.cal_cn_tax()
elif tax_type == TaxType.US_TAX:
self.cal_us_tax()
elif tax_type == TaxType.DE_TAX:
self.cal_de_tax()
def cal_cn_tax(self):
print('cal_cn_tax')
def cal_us_tax(self):
print('cal_us_tax')
def cal_de_tax(self):
print('cal_de_tax')
if __name__ == '__main__':
sale_order = SalesOrder()
sale_order.calculate_tax(TaxType.CN_TAX)
# -*- coding:utf-8 -*-
class TaxStrategyBase():
def cal_tax(self):
pass
class CNTax(TaxStrategyBase):
def cal_tax(self):
print('CNTax cal_tax')
class USTax(TaxStrategyBase):
def cal_tax(self):
print('USTax cal_tax')
class DETax(TaxStrategyBase):
def cal_tax(self):
print('DETax cal_tax')
class SalesOrder(object):
def calculate_tax(self, tax_class_name):
tax = eval(tax_class_name)()
tax.cal_tax()
if __name__ == '__main__':
sale_order = SalesOrder()
sale_order.calculate_tax('CNTax')
SalesOrder
中用python
的eval
来创建不同的类对象,这里也可以使用工厂模式。SalesOrder
无需再更改,只需要新添加一个类即可。SalesOrder` 对应`Context`
`TaxStrategyBase`对应 `StrategyBase`
`CNTax`、 `USTax`、 `DETax`对应 `ConcreteStrategy`
稳定部分是`SalesOrder` 和`TaxStrategyBase