3.2 策略模式的运用(Strategy)

  先看一下原来的类:

  这种类型的代码在系统中较多地出现,有时候是以switch—case的形式,但更多的时候是根据条件的不一样选择不同的处理逻辑。当然现在的这个例子是简化后的,实际上handle中的选择分支更多,而private中的方法也不一定只有15行。对于这样的类和方法我们测试势必很难,因为重要的逻辑几乎在handleAtrade(),handleBtrade(),handleCtrade()里面,而这些方法在接口类MultiBranchService中是没有的。

  从代码本身来讲,这样写代码并不符合开闭原则(对扩展开放,对修改关闭),因为如果将来多了一种处理逻辑,需要新增一个private方法,然后在handle加个else if分支。对于这种情况可以采用策略模式解决,先定义一个策略的上下文,它只负责调用各种处理:

  可以看到本质上StrategyContext和MultiBranchServiceImpl没有本质的区别,只是将处理的具体逻辑注入进来了。现在要测试handle方法可以参考3.1中后测试fa?ade中的handle方法,只需测试type取不同值时响应的strategyHandle是否被调用。现在来看一下TradeStrategy,它只是一个接口:

  对于A/B/C行业的处理逻辑是TradeStrategy的实现: