策略模式

1.定义

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

2.代码演示------来自head first 设计模式

假设有许多鸭子,绿头鸭,模型鸭,玩具鸭,有的鸭子会飞,有的鸭子会叫,有的鸭子不会飞,有的鸭子不会叫,这边会飞和不会飞,会叫和不会叫都是相同的行为,一个是飞,一个是不会飞,这边可以单独抽象成两个接口

定义一个飞行接口

public interface FlyBehavior {
    void fly();
}

定义一个'叫'接口

public interface QuackBehavior {
    void quack();
}

然后飞行行为可以有  靠翅膀飞行,或者靠一个火箭飞行器飞行,实现类分别如下

public class FlyWithWings implements FlyBehavior{

    @Override
    public void fly() {
        System.out.println(" fly with wings");
    }
    

}

 

public class FlyNoWay implements FlyBehavior{

    @Override
    public void fly() {
        System.out.println("fly no way");
    }
    
}

 

public class FlyRocketPowered implements FlyBehavior{

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

}

 

'叫'行为可以有呱呱叫(quack),吱吱叫(squeak),和不发出叫声(mutesquack),实现类如下

public class Quack implements QuackBehavior{

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

 

public class Squeak implements QuackBehavior{

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

}

 

public class MuteQuack implements QuackBehavior{

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

}

 

定义了鸭子的各种行为实现后,我们就可以定义抽象类鸭子了,这边有意思的就是把行为都抽象成一个方法,'不会飞'也单独作为一个类来表示

定义抽象鸭子类

public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    
    void performQuack() {
        quackBehavior.quack();
    }
    void performFly() {
        flyBehavior.fly();
    }
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
    
}

这边通过组合来实现 飞行为 和'叫'行为,如果是不会飞的鸭子,直接把 FlyNoWay赋值给 flyBehavior类即可.

 

编写测试类

public class MiniDuckSimulator {
    public static void main(String[] args) {
        
        Duck model = new ModelDuck();
        model.performFly();
        model.setFlyBehavior(new FlyRocketPowered());
        model.performFly();
    }
}

 

这里我们可以看到,通过set方法可以随时改变行为(策略);

 

3.总结

鸭子的  飞 和叫  可以抽象成行为,通过组合方式来实现每一种鸭子的行为.  就是给抽象成接口的行为赋值来实现具体的 飞 和叫 ;

 

posted @ 2019-06-24 23:06  随意的马蒂洛克  阅读(159)  评论(0编辑  收藏  举报