设计模式(python实现)--策略模式(Strategy)

2019-12-29  本文已影响0人  远行_2a22

动机(Motivation)

模式定义

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。
——《设计模式》 GoF

要点总结

UML

image.png

例子-计算不同货币的税

原始的代码中,当随着业务的需要,需要支持新的货币,比如韩元、日元,那么就需要修改枚举,添加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')

对照UML分析

SalesOrder 对应Context
TaxStrategyBase对应 StrategyBase
CNTaxUSTaxDETax对应 ConcreteStrategy
稳定部分是SalesOrderTaxStrategyBase

上一篇下一篇

猜你喜欢

热点阅读