先说几个例子,让大家对策略模式有个感性的认识;比如玩RPG游戏时,一个人物可以拥有多种武器,但是攻击时只能使用一把武器,切换武器的过程其实就是一个策略模式的应用。
故事案例:鸭子很多种(活生生的鸭子,橡皮鸭,模型鸭,木头鸭。。。),共性是可以swim,display(即给别人看),活生生的鸭子可以嘎嘎叫,橡皮鸭子可以吱吱叫,模型鸭可以飞,木头鸭什么特别之处都没有,那我们怎么处理这个问题呢?
思路一:鸭子作为一个抽象类(Duck),然后这些具体的鸭子就继承他,并重新新增一些自己特有的方法。(好像感觉挺好的设计是吧!清晰明了!)
缺陷:代码的可重用性不高,两个不同类型的鸭子,如果都可以嘎嘎叫,那么嘎嘎叫的方法(我把它定义quack())需要写两遍,两个还好啊,那要是一百个呢。。。
思路二:既然要代码可重用性高的话,那么把quack()方法放到抽象类中,不同的鸭子去继承他就行了,但是还是有问题,第一:我的模型鸭不会叫,你现在却可以让他嘎嘎叫,第二:我的橡皮鸭是吱吱叫,现在却是嘎嘎叫。。。有人就会说,我可以在子类重载这些方法啊,还是那个问题,一百个呢,而且还容易改出错。
思路三:设计原则是:多用组合,少用继承;现在我来说说这个的意思,对于不同的鸭子,他们的行为是不同的,从而导致处理方式不同,那么我们把不同的行为看成不同的算法;对于鸭子来说,他们应该是拥有(has-a)某种行为,而不是这种行为是(is-a)某种鸭子的;所以,把不同的行为定义为不同的类或接口。(QuackBehavior 和 FlyBehavior),具体的行为就实现这两种接口即可。
对于抽象类鸭子(Duck)只需持有这两种行为的父类(面向接口编程)引用,就可以实现不同行为的切换。
对应的UML图:
没有工具所以偷懒了。。。
版权声明:本文为博主原创文章,未经博主允许不得转载。