策略模式


1、概念理解

  定义一组算法族,对不同场景实现采用相应的算法实现,实现的同一种交互能力可以在不同的场景实现不同效果。

  把对象的能力抽象出来,在通过依赖注入的方式,把能力注入给对象,面对不同对象同种能力,相同对象不同场景,注入相应的能力。

2、示例

public class Duck {
    private FlyAble flyAble;

    private void setFlyAble(FlyAble flyAble) {
        this.flyAble = flyAble;
    }

    public Duck() {
    }

    public Duck(FlyAble flyAble) {
        this.flyAble = flyAble;
    }
    
    public void fly(){
        this.flyAble.fly();
    }
}

public class WildDuck extends Duck{
    private FlyAble flyAble;

    public WildDuck(FlyAble flyAble) {
        this.flyAble = flyAble;
    }

    public WildDuck() {
    }

    @Override
    public void fly() {
        flyAble.fly();
    }

    public void setFlyAble(FlyAble flyAble) {
        this.flyAble = flyAble;
    }
}
public class PetDuck  extends Duck{
    private FlyAble flyAble;

    public PetDuck() {
    }

    public PetDuck(FlyAble flyAble) {
        this.flyAble = flyAble;
    }

    @Override
    public void fly() {
        flyAble.fly();
    }

    public void setFlyAble(FlyAble flyAble) {
        this.flyAble = flyAble;
    }
}
public interface FlyAble {
    void fly();
}
public class NormalFlyAble implements FlyAble{
    @Override
    public void fly() {
        System.out.println("flying normal");
    }
}
public class SuperFastFlyAble implements FlyAble{
    @Override
    public void fly() {
        System.out.println("flying super fast");
    }
}
public class Test {
    public static void main(String[] args) {
        FlyAble normalFlyAble = new NormalFlyAble();
        FlyAble superFastFlyAble = new SuperFastFlyAble();
        PetDuck petDuck = new PetDuck(normalFlyAble);
        WildDuck wildDuck = new WildDuck(superFastFlyAble);
        petDuck.fly();
        wildDuck.fly();
        System.out.println("训练了petDuck飞的很快");
        petDuck.setFlyAble(superFastFlyAble);
        petDuck.fly();
        System.out.println("被收养了吃肥了飞的比以前慢了");
        wildDuck.setFlyAble(normalFlyAble);
        wildDuck.fly();
    }
}
运行结果:
flying normal
flying super fast
训练了petDuck飞的很快
flying super fast
被收养了吃肥了飞的比以前慢了
flying normal