策略模式

Posted 紫色年华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式相关的知识,希望对你有一定的参考价值。

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

设计原则:1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。(把变化的飞行行为、呱呱叫行为从不变的鸭子类中取出来)

      

     2、针对接口编程,而不是针对实现编程。(FlyBehavior、QuackBehavior)

        3、多用组合,少用继承。(有一个比是一个更好)

      

Talk is cheap,

Duck类:

public abstract class Duck {

    /*
    * 行为接口
    * */
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck(){

    }
    public abstract void dispaly();


    /*
    * 设定鸭子的行为
    * */
    public void setFlyBehavior(FlyBehavior fb){
        flyBehavior = fb;
    }

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

    /*
    * 委托给行为类
    * */
    public void performFly(){
        flyBehavior.fly();
    }

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

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

}

Fly接口、Quack接口:

/*
* 飞行接口
* */
public interface FlyBehavior {
    public void fly();
}

public interface QuackBehavior {
    public void quack();
}

实现:

/*
* 不会飞的鸭子的行为
* */
public class FlyNoWay implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("i cant fly!!");
    }
}

public class FlyRocketPowered implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("i\'m flying with a rocket!");
    }
}

/*
*真会飞的鸭子的行为
* */
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("<Since>");
    }
}

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("Sqeak");
    }
}

子类:

public class MallardDuck extends Duck{
    public MallardDuck(){
        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();
    }

    @Override
    public void dispaly() {
        System.out.println("i\'m a real Mallard duck!");
    }
}

public class ModelDuck extends Duck{
    public ModelDuck(){
        flyBehavior = new FlyNoWay();
        quackBehavior = new MuteQuack();
    }

    @Override
    public void dispaly() {
        System.out.println("i\'m a model duck!");
    }

}

 

测试:

public class MiniDuckSimulator {
    public static void main(String[] args){
        Duck mallard = new MallardDuck();
        mallard.performFly();//调用MallardDuck继承的performFly()方法,进而委托给该对象的FlyBehaviour处理
        mallard.performQuack();

        Duck model1 = new ModelDuck();
        model1.performFly();
        model1.setFlyBehavior(new FlyRocketPowered());//动态的改变飞行行为
        model1.performFly();
    }
}

 

以上是关于策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现分布式锁(设计模式应用实战)

用于从 cloudkit 检索单列的代码模式/片段

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式