策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式的优点有:策略模式提供了管理相关的算法族的办法、策略模式提供了可以替换继承关系的办法、使用策略模式可以避免使用多重条件转移语句。

以上来自百度百科!!

设计原则:

1、找出应用中可能需要变化之处,把它独立出来,不要和那些不需要变化的代码混在一起。

2、针对接口编程,而不是针对实现编程。

3、多用组合,少用继承。

类图:

 


 

代码:

两个接口:FlyBehavior、QuackBehavior

/**

* 飞行接口

*/

public interface FlyBehavior {

    /**

    * 飞行方法

    */

    public void fly();

}

/**

* 叫声接口

*/

public interface QuackBehavior {

    /**

    * 叫声接口

    */

    public void quack();

}

两个接口实现类:FlyWithRocket 、HeQuack

public class FlyWithRocket implements FlyBehavior{

    @Override

    public void fly() {

        System.out.println("Fly With Rocket!!!");

    }

}

public class HeQuack implements QuackBehavior {

    @Override

    public void quack() {

        System.out.println("guaguaguagsdfsdfsdf");

    }

}

鸭子实体 Duck

/**

* 鸭子实体

*/

public class Duck {

    public FlyBehavior flyBehavior;

    public QuackBehavior quackBehavior;

    public void performQuack(){

        quackBehavior.quack();

    }

    public void performFly(){

        flyBehavior.fly();

    }

    public void swim(){

    }

    public void display(){

    }

    public void setFlyBehavior(FlyBehavior flyBehavior) {

        this.flyBehavior = flyBehavior;

    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {

        this.quackBehavior = quackBehavior;

    }

}

鸭子实体子类:ModelDuck

/**

* 模型鸭子实体

*/

public class ModelDuck extends Duck{

    public ModelDuck(){

        flyBehavior=new FlyNoWay();

        quackBehavior=new HeQuack();

    }

    @Override

    public void display() {

        //*****

    }

}

运行测试类:PatternStrategy

/**

* Created by zyzhmily on 2018/5/19.

*/

public class PatternStrategy {

    public static void main(String[] args){

        Duck model=new ModelDuck();

        model.performFly();

        model.setFlyBehavior(new FlyNoWay());

        model.performFly();

    }

}

本文来自 《Head First 设计模式》