Headfirst java设计模式-策略模式

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

代码实现:
(1)定义两个算法族(策略)的接口

public interface FlyBehavior {
    void fly();
}

public interface QuackBehavior {
    void quack();
}

(2)定义一个接口,采用组合的方式调用相应的算法族(策略)接口。

public abstract class Duck {
    FlyBehavior flybehavior;
    QuackBehavior quackbehavior;

    public Duck(){

    }

    public void performFly(){
        flybehavior.fly();
    }

    public void performQuack(){
        quackbehavior.quack();
    }

    public void swim(){
        System.out.println("All duck float, even decoys");
    }

    public void setFlyBehavior(FlyBehavior fb){
        flybehavior = fb;
    }

    public void setQuackBehavior(QuackBehavior qb){
        quackbehavior = qb;
    }

}

(3)继承两个算法族(策略)接口,实现相应的实现类

public class FlyNoWay implements FlyBehavior{

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("I can't fly.");
    }
}

public class FlyRocketPowered implements FlyBehavior{

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("I am fly with a rocket.");
    }
}

public class FlyWithWings implements FlyBehavior{

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("I'm flying.");
    }
}

public class MuteQuack implements QuackBehavior{

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        System.out.println("<<Silence>>");
    }
}

public class Quack implements QuackBehavior{

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        System.out.println("Quack");
    }
}

public class Squeak implements QuackBehavior{

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        System.out.println("Squeak");
    }
}

(4)继承duck接口,实现具体的duck类,实例化不同的算法族(策略)。

public class MallardDuck extends Duck {

    public MallardDuck(){
        quackbehavior = new Quack();
        flybehavior = new FlyWithWings();
    }
}

public class ModleDuck extends Duck {

    public ModleDuck(){
        flybehavior = new FlyNoWay();
        quackbehavior = new Quack();
    }

    public void display(){
        System.out.println("I am a modle Duck.");
    }
}

(5)测试代码

public class MiniDuckSimulator {
    public static void main(String[] args){
        Duck mallard = new MallardDuck();
        mallard.performFly();
        mallard.performQuack();

        Duck modle = new ModleDuck();
        modle.performFly();
        modle.setFlyBehavior(new FlyRocketPowered());
        modle.performFly();
    }
}

猜你喜欢

转载自blog.csdn.net/MoonShinesOnMyWay/article/details/81449927