策略模式
《大话设计模式》第二章以商场收银系统为例讲述了策略模式的应用。策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
结构组成
- 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
- 具体策略角色:包装了相关的算法和行为。
- 环境角色:持有一个策略类的引用,最终给客户端调用。
应用场景
- 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
- 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
- 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
UML结构图
代码实现
策略模式实现商场收银系统,Python实现代码:
#!usr/bin/env python
# coding:utf-8
from abc import ABCMeta, abstractmethod
class CashSuper:
__metaclass__ = ABCMeta
@abstractmethod
def accept_cash(self, money):
pass
class CashNormal(CashSuper):
def accept_cash(self, money):
return money
class CashRebate(CashSuper):
__money_rebate = 1
def accept_cash(self, money):
return money * self.__money_rebate
class CashReturn(CashSuper):
__money_condition = 0.0
__money_return = 0.0
def accept_cash(self, money):
if money >= self.__money_condition:
return money - int(money / self.__money_return) * self.__money_return
else:
return money
class CashContext:
__type_dict = {
"正常收费": CashNormal(),
"满300返100": CashReturn,
"打8折": CashRebate,
}
def __init__(self, type):
self.cash = self.__type_dict[type]
def get_result(self, money):
return self.cash.accept_cash(money)
参考资料
1: 《大话设计模式》程杰 著
2: 百度百科:
http://baike.baidu.com/link?url=_sxfxWyOnDWOiStybzV5N-XGsDVyiSFCHORbrjXQ_EJxBw06FG8W-8tCfJtM5ZLIRgMv4oWsZ9c60TIGYVr38a