策略模式

Posted yuki67

tags:

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

策略模式:定义了算法族(行为)分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户,常用的应用场景:用一群类计算不同州的销售金额等。

实例说明:普通的鸭子会飞也会叫,但是模型鸭子会叫不会飞,现在想让模型鸭子也会飞,将飞和叫的行为分别封装起来。

鸭子抽象类:Duck.java

/**
 * 鸭子抽象类
 *
 * @author :liuqi
 * @date :2018-06-11 17:10.
 */
public abstract class Duck {
    /**
     * 封装飞行行为
     */
    FlyBehavior flyBehavior;
    /**
     * 封装叫行为
     */
    QuackBehavior quackBehavior;

    /**
     * 构造器
     */
    public Duck() {

    }

    /**
     * 描述继承子类的方法
     */
    abstract void display();

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

    /**
     * 表演叫
     */
    public void performQuack() {
        // 委托给叫行为类
        quackBehavior.quack();
    }

    /**
     * 游泳(所有鸭子都会游泳)
     */
    void swim() {
        System.out.println("All ducks float,even decoys!");
    }

    /**
     * 设置飞行行为(可随时改变行为)
     */
    void setFlyBehavior(FlyBehavior fb) {
        flyBehavior = fb;
    }

    /**
     * 设置叫行为(可随时改变行为)
     */
    void setQuackBehavior(QuackBehavior qb) {
        quackBehavior = qb;
    }
}

 

模型鸭子实现类:ModelDuck.java

/**
 * 模型鸭子:会叫不会飞
 *
 * @author :liuqi
 * @date :2018-06-11 17:24.
 */
public class ModelDuck extends Duck{
    /**
     * 构造器
     */
    public ModelDuck(){
       flyBehavior = new FlyNoway();
       quackBehavior = new Quack();
    }

    /**
     * 描述方法
     */
    @Override
    void display() {
        System.out.println("I‘m a model duck");
    }
}

 

飞行行为接口:FlyBehavior.java

/**
 * 飞行行为接口
 *
 * @author :liuqi
 * @date :2018-06-11 17:11.
 */
public interface FlyBehavior {
    /**
     * 飞行
     */
    void fly();
}

 

不会飞实现类:FlyNoway.java

/**
 * 不会飞
 *
 * @author :liuqi
 * @date :2018-06-11 17:27.
 */
public class FlyNoway implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("I can‘t fly");
    }
}

 

带火箭飞实现类:FlyRocketPowered.java

/**
 * 用火箭飞起来
 *
 * @author :liuqi
 * @date :2018-06-11 17:31.
 */
public class FlyRocketPowered implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("I‘m flying with a rocket");
    }
}

 

叫的行为接口:QuackBehavior.java

/**
 * 叫的行为接口
 *
 * @author :liuqi
 * @date :2018-06-11 17:12.
 */
public interface QuackBehavior {
    /**
     * 叫
     */
    void quack();
}

 

会叫的实现类:Quack.java

/**
 * 会叫
 *
 * @author :liuqi
 * @date :2018-06-11 17:28.
 */
public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("Quack");
    }
}

测试类:DuckTestDrive.java

/**
 * 测试类
 *
 * @author :liuqi
 * @date :2018-06-11 17:29.
 */
public class DuckTestDrive {
    public static void main(String[] args) {
        // 模型鸭子
        Duck modelDuck = new ModelDuck();
        modelDuck.performFly();
        modelDuck.setFlyBehavior(new FlyRocketPowered());
        modelDuck.performFly();
    }
}

运行结果:

I can‘t fly
I‘m flying with a rocket

另一个实例:计算购车总金额,

购买5辆及以下不打折
购买6-10辆打9.5折
购买11-20辆打9折算法实现
购买20辆以上打8.5折算法实现

实现地址:http://www.private-blog.com/2017/11/16/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F/





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

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

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

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

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

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

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