策略模式的正式定义为:它定义了一个算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
这个概念毕竟是对这个模式的高度总结,我们可以先不必了解其含义,看完下面内容后,大家可以回头再揣摩一下定义的奥妙之处。
我先来举一个生活中的实例:
如果现在我需要写一个关于飞机行为的类,暂且描述飞机的三个行为动作:
1.可以飞;
2.有两个机翼;
3.客运功能。
我们会想到建一个飞机类Plane,之后建各种飞机子类来继承父类就好了。但是如果只是单纯的继承父类,飞机子类真的还能适用吗?对于可以飞和有两个机翼基本上飞机都可以满足,但是对于飞机的功能很明显是不可以的,比如说侦察机是没有客运功能的,战斗机也是没有客运功能的。
解决方案:
1.可以让子类来重写父类的功能方法(这种方法很明显是不可取的,如果说飞机种类很多,你不得不为每一个种类的飞机都要重写这样的一个方法,很重要的一点是,对于同样有战斗功能的战斗机和轰炸机,你却不得不重写两遍一模一样的功能函数,如果有10个、20个、100个相同功能的不同子类,你也要硬着头皮写下去吗?)
2.可能大家会觉得,或许一开始父类Plane的类结构或许就已经存在问题,但是如果去掉这一个行为,那么每个子类还是要去添加这样一个方法,这样就回到了解决方案1的弊端上去了。更何况,飞机的功能原本就是每个飞机要有的基本属性,抽象到父类从逻辑上讲完全行得通。
3.策略模式登场!解决方案2其实已经有点接近了,不过不是去掉这一个方法,而是要将此方法抽象出来,不表示具体某一功能。
我们结合代码一起探讨。首先创建一个父类Plane。
public class Plane {
Function function;
public void fly(){
System.out.println("can fly!");
}
public void appearance(){
System.out.println("has two wings");
}
public void performFun