Posts

策略模式

策略模式的一个方便之处在于它可以移除一些“同层级”的逻辑判断分支。

比如说,文件格式转换,可能的实现会根据后缀或者枚举类型等判断所有条件,然后每个条件下依次调用静态方法。

好一点的情况下可能每个条件下是一个临时实例,其中封装了相应格式的方法。

这样的问题在于每次新增格式都要改这个条件分支。

更进一步可以提出一个策略接口,创建一个策略类实例数组,将匹配规则实现在策略类中,用一个循环匹配并调用。这样后续再添加新规则只需要在策略类实例数组中新建一个实例就行了。

策略模式的思路

在上面的例子描述中可以察觉到需要:

可以发现这和状态模式十分相似,本质上都是把“行为”委托给独立的类,不同之处在于策略模式没有“状态转移”的部分,或者可以认为它是针对“一个独立的状态”。

示例:出行方式

以「怎么去目的地」为例,五种出行方式就是五个并列的策略:

类图:「适不适合这次行程」的匹配规则封装在各策略类的 CanHandle 中,TravelContext 只持有一个策略实例数组,循环匹配、命中即委托;下方时序图:两次行程条件不同,走的却是同一段循环与委托代码——命中哪个策略,完全由行程数据决定。