浅谈策略模式
策略模式是一个特殊的存在,很多设计模式的初学者都喜欢把她当成第一个去掌握的模式,因为觉得这个模式就像简单工厂模式那样简单,甚至很多时候都会有人问她与简单工厂或者工厂模式有什么区别,今天这个话题就是围绕这个话题来展开的。
策略模式与工厂模式有什么区别呢?首先我想从字面理解,一个是策略一个是工厂。思想维度就有很大的区别,工厂只是生产产品的,说白了就是工人,领导让你干啥你就干啥,无论你生产的产品过程有多么复杂,你就是个技术工种。策略是什么,往大了说是战略,一个战略是可以决定许多的产品是否还需要被创建或者使用,你说这里面的区别大不大,如果光从基础的代码实现上来说,二者的区别还真不大,关键是代码的使用和这段代码到底放到了哪个位置上。
策略模式很多的教材中都把她用来封装算法,按照不同维度计算个税率,工资,奖金,积分啥的,我觉得有点狭隘, 今天我想说一说应用系统的角色,比如说处长,科长和股长,在应用系统的驾驶舱,不同的角色看到的内容是完全不同的,这个就是不同的策略,然后往下说,请假审批,资金审批和系统与角色相关的操作都需要使用策略模式来处理,否则就会出现一个问题,系统来了个新角色比如局长,他来了,如果不用策略模式,我们就需要在所有涉及到角色处理的代码中再增加一个else来判断角色,一个系统可能有10处这样的代码,你改不过来,也不改改,线上系统这么改还能用么,这个时候还是要用策略模式,增加一个新的角色,多创建出来一些新的类,满足开闭原则,不会影响到其他角色之前的处理,何乐而不为呢。
接下来再具体一些,说说策略模式的代码实现,
首先涉及到几个主要的类:
- context 上下文,这个相当关键,一般来说要把角色放到这里,也就决定了到底要用那种策略,你说关键不。
- strategy 可以是个抽象类或者是接口,定义策略接口,我觉得这里面可以把跟策略有关的方法都写在这个接口中,但是又好像不满足接口隔离的原则,可以参考一下外观模式。
- strategyimpl 这个就不解释了,懂得都懂。
总之,不要把策略模式狭隘的停留在计算上,算那几个钱根本配不上策略的这个名字,策略决定的很多类的生死,是一个很大的维度。一个策略就是一个系统。