策略模式:
定义了算法簇,别离封装起来,让它们之间能够相互替换,此模式让算法的变动能够独立于算法的客户。

具体实例:
当初咱们要创立各种鸭子对象,这些鸭子有者不同的行为能力,会叫的,会飞的,不会叫的,不会飞的,飞得很快像火箭一样的等等。

咱们首先剖析鸭子的能力次要有两种,叫与飞。因而咱们将这两种能力剥离进去,定义为了接口。叫的差异化在叫的具体行为类来实现。飞的差异化能力在飞的具体类实现。

这样咱们就将接口与实现拆散了。

行为接口就像是一类算法,具体的行为类就是这类算法的差异化实现。当要扩大这类算法时,只须要增加新的行为类。

代码样例:

飞动作的行为接口public interface FlyBehavior {    public void fly();}
叫动作的行为接口public interface QuackBehavior {    public void quack();}
飞的具体行为类1public class FlyNoWay implements  FlyBehavior{    @Override    public void fly() {        System.out.println("i cant not fly");    }}
飞的具体行为类2public class FlyWithWings implements  FlyBehavior{    @Override    public void fly() {        System.out.println("i am flying");    }}
飞的具体行为类3public class FlyWithRocket implements FlyBehavior{    @Override    public void fly() {        System.out.println("i am flying with rocket");    }}
叫的具体行为类1public class MuteQuack implements QuackBehavior{    @Override    public void quack() {        System.out.println("silence");    }}
叫的具体行为类2public class Quack implements  QuackBehavior{    @Override    public void quack() {        System.out.println("quack: gua gua gua");    }}

抽象类Duck是具备叫和航行为的一类对象,咱们将Duck定义为了抽象类,在该类中蕴含了行为接口,通过行为接口对具体行为类的援用(多态),达到了行为的多态实现。

public abstract class Duck {    //行为接口    FlyBehavior flyBehavior;    QuackBehavior quackBehavior;    public void performFly(){        flyBehavior.fly();    }    public void performQuack(){        quackBehavior.quack();    }    //赋予飞这个具体动作类的援用    public void setterFlyBehavior(FlyBehavior flyBehavior){        this.flyBehavior = flyBehavior;    }     //赋予叫这个具体动作类的援用    public void setterQuackBehavior(QuackBehavior quackBehavior){        this.quackBehavior = quackBehavior;    }    public abstract void display();}
鸭子对象:通过构造函数填充鸭子的行为public class ModelDuck extends Duck{    //在鸭子的结构器内实例化鸭子的行为    public ModelDuck(){        this.flyBehavior = new FlyNoWay();        this.quackBehavior = new MuteQuack();    }    @Override    public void display() {        System.out.println("i am a model duck");    }}通过set办法赋予鸭子的行为。public class NewModelDuck extends Duck{    @Override    public void display() {        System.out.println("i am a new duck");    }}
测试:public class DuckSimulator {    public void duckConstructBehavior() {        Duck model = new ModelDuck();        model.performFly();        model.performQuack();    }    public void duckSetterBehavior(){        Duck newModelDuck = new NewModelDuck();        newModelDuck.setterFlyBehavior(new FlyWithRocket());        newModelDuck.setterQuackBehavior(new Quack());        newModelDuck.performQuack();        newModelDuck.performFly();    }}
import junit.framework.TestCase;public class DuckSimulatorTest extends TestCase {    private    DuckSimulator duckSimulator = new DuckSimulator();    public void testDuckConstructBehavior() {        duckSimulator.duckConstructBehavior();    }    public void testDuckSetterBehavior() {        duckSimulator.duckSetterBehavior();    }}

测试后果:

i am a model ducki cant not flysilencei am a new duckquack: gua gua guai am flying with rocket