定义了一个算法族,将他们分别封装起来,让他们之间可以互相替换,此模式让算法的变化,独立于使用算法的客户。
思考一个场景:
有一个鸭子的接口,鸭子可以叫 飞 将鸭子定义为一个接口,叫 和 飞成为其中的两个方法。后续出来了 具体的实现类:
红鸭子 白鸭子 他们除了外观不同 叫 和 飞是相同的。
橡皮鸭子:会叫 但是不会飞 而且叫声与 红鸭子 白鸭子 不同。
丑小鸭:会叫 2岁之前不会飞 2岁之后可以飞
....... 这样的鸭子有许多许多 叫声和飞的行为各有不同
如果把鸭子作为接口,其他的具体事物都作为实现类的话 这样 红鸭子 白鸭子 .... 就会出现同样的代码。
下面介绍一种策略模式的东西来解决这个问题。
策略模式的关键:
找出应用中可能出现的变化之处,将他们独立出来,不要和那些不需要变化的代码混在一起。
多用组合 ,少用继承
针对接口编程,不对实现进行编程。
实例:
将鸭子的叫声 和 飞行 动作 独立出来:
将变化的部分与使用的客户独立出来,自己变化自己的,中间通过接口来调用
将叫声独立出一个接口
package com.wc.study.strategy;
public interface CallBehaviour {
void call();
}
叫声的一个实现类 :
package com.wc.study.strategy;
public class CallBygg implements CallBehaviour{
@Override
public void call() {
System.out.println("i call guagua ");
}
}
另一个实现叫声的类:
package com.wc.study.strategy;
public class CallByzz implements CallBehaviour{
@Override
public void call() {
System.out.println(" i call zhizhi~");
}
}
将飞的行为独立出来:
package com.wc.study.strategy;
public interface FlyBehaviour {
void fly();
}
第一种飞的情况:
package com.wc.study.strategy;
public class FlyNoWay implements FlyBehaviour{
@Override
public void fly() {
System.out.println(" i cannot fly");
}
}
第二种飞的情况:
package com.wc.study.strategy;
public class FlyWithWing implements FlyBehaviour{
@Override
public void fly() {
System.out.println("i can fly with wing");
}
}
鸭子:(鸭子有飞的行为 和 叫的行为 只是外观不同)使用组合的方式将鸭子组合起来。
package com.wc.study.strategy;
public abstract class Duck {
CallBehaviour callBehaviour;
FlyBehaviour flyBehaviour;
public abstract void display();
public void call(){
callBehaviour.call();
}
public void fly(){
flyBehaviour.fly();
}
}
一只橡皮鸭:
package com.wc.study.strategy;
/**
* 橡皮鸭
* @author wangchen
*
*/
public class RubberDuck extends Duck{
public RubberDuck() {
super.callBehaviour = new CallByzz();
super.flyBehaviour = new FlyNoWay();
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("i am rubber duck");
}
}
package com.wc.study.strategy;
public class DemoTest {
public static void main(String[] args) {
Duck duck = new RubberDuck();
duck.display();
duck.call();
duck.fly();
// i am rubber duck
// i call zhizhi~
// i cannot fly
}
}