策略模式

定义:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

类图:

image.png

事例:模拟鸭子应用
鸭子的外表,游泳,叫声,飞行等行为。
并不是所有的鸭子都会飞行,并不是所有鸭子的叫声都一样,所以把鸭子的叫声和飞行行为都抽象出来。
飞行行为的接口

public interface FlyBehavior {

    void fly();
}

鸣叫行为的接口

public interface QuackBehavior {
    void quack();
}

实现接口,列举可能的行为。
飞行行为的实现

public class FlyNoWay implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("I can't fly");
    }
}

public class FlyWithWings implements FlyBehavior {


    @Override
    public void fly() {
        System.out.println("I'm flying !!");
    }
}

鸣叫行为的实现

public class MuteQuack implements QuackBehavior {

    @Override
    public void quack(){
        System.out.println("<< slience >>");
    }
}
```public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("Quack");
    }
}
public class Squeak implements QuackBehavior {

    @Override
    public void quack(){
        System.out.println("Squeak");
    }

}

鸭子的抽象类:

public abstract class Duck {

    private FlyBehavior flyBehavior;
    private QuackBehavior quackBehavior;

    public void setFlyBehavior(FlyBehavior flyBehavior){
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior){
        this.quackBehavior = quackBehavior;
    }


    public abstract void dispaly();

    public void performFly(){
        this.flyBehavior.fly();
    }

    public void performQuack(){
        this.quackBehavior.quack();
    }

    public void swim(){
        System.out.println("All ducks can swim");
    }
}

通过set方法可以动态改变鸭子的行为
鸭子的具体实现类

public class MallardDuck extends Duck {

    MallardDuck(){
        setFlyBehavior(new FlyWithWings());
        setQuackBehavior(new Quack());
    }
    @Override
    public void dispaly() {
        System.out.println("I'm a mallard duck");
    }
}

测试类

public class Test {

    public static void main(String[] args){
        MallardDuck mallardDuck = new MallardDuck();
        mallardDuck.performFly();
        mallardDuck.performQuack();
        mallardDuck.swim();
        mallardDuck.dispaly();
        mallardDuck.setFlyBehavior(new FlyNoWay());
        mallardDuck.performFly();
    }
}

可以将每组行为看成一个算法族。

你可能感兴趣的:(策略模式)