策略模式的概念
定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
我个人理解
就是把一个类(超类或者父类)中可变的行为或者状态封装起来成为一些独立的类,这样我们就能随时改变或者添加新功能而不影响父类或者超类的结构和抽象。
用例子来理解
最常见的例子是模拟鸭子,问题是这样的,现在要设计一个鸭子类,鸭子会叫会飞,那么该如何设计这样的类呢?
1.真的鸭子(会飞会叫)--------------(呱呱叫,飞很低)
2.橡皮鸭(只会叫不会飞)--------------(吱吱叫,不会飞)
3.模型鸭(不会叫也不会飞)-------------(即不会叫也不会飞)
4.等等你能想到的鸭子
我们可以看到对于不同种类的鸭子,它们的行为也是不同的,所以我们就可以将这些行为看成算法族(这些行为是可变部分),封装起来成为新的类,这样改变这些行为就不会改变到最初的鸭子类上,策略设计模式正好提供了这样的解决方案。
代码理解
1.设计抽离出来的算法类
叫的行为类
飞的行为类
2.设计鸭子类(超类)
3.好了,现在加入我们要来一个真鸭子,那么真会叫和飞,那么就去做具体的实现类
真鸭子叫的实现类
真鸭子飞的实现类
4.好了,真鸭子的行为类设计好了,那么该设计它本身了
5.写个测试类
6.结果
7.我们也可以测试一下其它的鸭子,例如模型鸭,按照上面的过程,先设计行为类,然后设计本身
8.可以看出,我们可以很轻易的改变不同的鸭子实现不同的叫声和飞行模式,而不同修改原本的鸭子类,这里利用的就是运行时多态,所以我们能不能动态的设置不同的鸭子呢?
1.这是可以的,我们只需要在鸭子类中生成setter方法即可动态设置
2.现在我们来修改一下模型鸭,本来它不会飞嘛。现在需求变了,它能飞了,我们就可以利用setter方法动态改变
3.结果
4.现在针对不同的鸭子我们就可以轻易实现不同的行为,哪怕它日后突然要改变行为我们也可以实现(就是让不会飞的飞,不会叫的叫)
5.最后给出uml图,更加清晰(idea快捷键(鼠标放到包上按住ctrl+alt+u选择第一个选项))
总结一下,可以看出,策略模式确实扩展性很高,很有弹性,我们甚至可以在运行时改变一个类的行为,这样在开发中复用代码和创新都会很方便,但是它的缺点也明显,就是每个不同的用户或者说子类都要创建不同的行为类(算法族),而且必须知道怎么做。这里就会产生很多的类,让系统庞大