本章将使用函数对象重构“策略”模式,还将讨论一种更简单的方式,用于简化“命令”模式。
6.1 案例分析:重构“策略”模式
《设计模式:可复用面向对象软件的基础》一书是这样概括“策略”模式的:
定义一系列算法,把它们一一封装起来,并且使它们可以互相替换。本模式使得算法可以独立于使用它的客户而变化。
电商领域有一个经典的“策略”模式,根据客户的属性或订单中的商品计算折扣。下图的UML类图指出了“策略”模式对类的编排:
假如一个网店指定了下述折扣规则:
- 有1000或以上积分的顾客,每个订单享5%折扣。
- 同一订单中,单个商品的数量达到20个或以上,享10%折扣。
- 订单中的不同商品达到10个或以上,享7%折扣。
根据“策略”模式的UML类图,其中涉及下列内容:
上下文
把一些计算委托给实现不同算法的可互换组件,它提供服务。在这个例子中,上下文是Order,它会根据不同的算法计算促销折扣。
策略
实现不同算法的组件共同的接口。在这个例子中,Promotion的抽象类扮演这个角色