设计模式-策略模式
在实际开发过程中,经常会发生这样的一件事,我们需要实现一系列的功能,这些功能在逻辑上是可以抽象成一样的方法,不同的实现,也就是多态,有一种解决方法是,设计一个基类,然后我们定义一些方法,然后继承这个类,设计不同的子类,不同的实现,这样子我们就可以定义基类来调用子类的方法,实现多态,这种方法一定程度上是实现了代码复用。
但是会有一个问题,假设,基类BaseClass具有一个方法,他们的子类都具有两个方法A和B,其中方法A的实现,所有的子类都一样,很明显A的实现方法是放在基类中实现的,如果B的方法每个子类的实现都不是一样的,那么毫无疑问的是我们会在每个子类中重写B的实现。这些都是显而易见的,但是某一天需求变了,BaseClass的子类childClass1,childClass2的B方法的实现是完全一样的,childClass3,childClass4的B方法的实现也是一样的,如果我们再在每个子类中实现这个方法,很明显,代码复用很不完美。也许我们会这样子解决这个问题:
在现有的基类和子类中再添加一层,分别为childClass1,childClass2添加由BaseClass继承而来的一个父类,使得这两个子类从新增的这个类中继承,而他们的B方法的实现放在这个新增的类中,同样的操作对childClass3,childClass4进行。
这个方法一定程度上是解决了上面的问题,但是新的问题又出现了,如果再来一个方法C,childClass2和childClass3的方法C的实现又是一样的,那又该怎么办?显然我们的设计很有问题。此时我们就需要题目中所说的设计模式—-策略模式。
策略模式的概念太过抽象,我们先看看如何解决上诉问题:
我们通过接口来解决这些变化的方法,我们针对可能会变化的B,C两个方法分别定义一个接口interfaceB,interfaceC,针对childClass1,childClass2我们定义一个类classB1用他们的方法B来实现interfaceB,同理我们生成classB2,classC1,classC2,classC3分别对应不同的方法B和C的实现,这样子,我们只要在基类中定义一个B,C类型为interfaceB,interfaceC的方法引用变量和两个引用对应的setter方法,就可以在子类的构造函数中通过setter方法定制属于自已的方法B,C了,从而很好的实现了代码复用的同时,降低了耦合性,增强了可扩展性。
我们将这种方法B和C称为策略,那么我们的策略模式,就是针对每一类方法我们定义一套策略,这一套策略是对一类方法的不同实现,他们之间可以互相替换,这种方法可以让算法的变化独立在了使用算法的客户。
这一章里面,也抽象出了下面的3种设计原则:
1、封装变化
2、多用组合,少用继承
3、针对接口编程,不针对实现编程