策略模式意思是说在同一个问题上,可以使用多种方法来解决,以排序问题为例,可以使用的排序算法有很多,但是每种算法的时间、空间复杂度是不一样的,所以在不同的情况下,就需要选择不同的算法进行排序运算。策略模式鼓励使用多种算法来解决一个问题,其特性是能够在运行时透明的切换算法而客户端不需要感知这个变化。
模式概述
《设计模式:可复用面向对象软件的基础》中是这样描述“策略模式”的:定义一系列算法,把它们一一封装起来,并且是它们可以相互替换。本模式使得算法可以独立于使用它的客户端而存在
软件实例
Python中的sorted()和list.sort()就是策略模式的例子,两个函数都接受一个命名参数key,这个参数本质上是实现了一个排序策略的函数的名称
生活中的实例
电商领域有个功能可以明显使用策略模式,就是根据客户的属性或订单中的商品计算折扣。我们假设有一个网站设定了如下规则:
|
|
简单起见,我们假设一个订单一次只能享受一次折扣,我们画出以下的UML图:
- 上下文:把一些计算委托给不同算法的可互换组件,他提供服务。在这个示例中上下文是Order,他会根据不同的算法计算促销折扣
- 策略:实现不同算法的组件共同的接口。在这个示例中,Promotion这个抽象类扮演这个角色
- 具体策略:“策略”的具体子类,这里是如图的三个实际策略
代码实现
以下是上述模式的具体实现,按照《设计模式》的说明,具体的策略由上下文类的客户端进行选择。
|
|
- 计算折扣只需调用self.promotion()函数
- 没有抽象类
- 每个策略都是函数
`` 注意在这里,不需要再新建订单的时候实例化新的促销对象,函数可以直接使用。 《设计模式》中指出:
策略对象通常是很好的享元(flyweight)享元的定义是:
享元是可共享的对象,可以同时在多个上下文中使用`
共享是策略模式推荐的做法,这样就不必再每个新的上下文里(这里是Order实例)中使用相同的策略时不断地新建具体的策略对象,从而减少了消耗