策略模式

Posted 21karat

tags:

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

策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换。客户端可以自行决定使用哪种算法。(许多相关的类行为不同(算法不同)可以使用策略)

常规代码:

    /*常规调用*/
    public static int getTotal(String type, int num) {
        int total = 0;
        switch (type) {
            case "a":
                if (num < 6)
                    total = 2;
                else
                    total = 1;
                break;
            case "b":
                if(num<4)
                    total = 1;
                else
                    total=1+(num-1)*4;
                break;
            case "c":
                total = total-1;
                break;
            default:
                break;
        }
        return total;
    }

策略改版代码:

public interface CalculateStrategy {
    /*策略模式的运算法则*/
    int calculate(int num);
}
public class NumberOne implements CalculateStrategy{
    /*具体策略1*/
    @Override
    public int calculate(int num) {
        return num<6?2:1;
    }
}
public class NumberTwo implements CalculateStrategy{
    /*具体策略2*/
    @Override
    public int calculate(int num) {
        return num<4?1:(1+(num-1)*4);
    }
}
public class NumberThree implements CalculateStrategy{
    /*具体策略3*/
    @Override
    public int calculate(int num) {
        return num-1;
    }
}
public class Context {
    /*抽象策略*/
    private CalculateStrategy strategy;
    private int num;
    /**
     * 构造函数设置具体策略
     * @param strategy
     * @param num
     */
    public Context(CalculateStrategy strategy,int num) {
        this.strategy = strategy;
        this.num = num;
    }
    /**
     * 封装后的策略方法
     * @return
     */
    public int calculate() {
        return this.strategy.calculate(num);
    }
}
public static void main(String[] args) {
        //策略者模式改版调用
        Context context;
        context=new Context(new NumberOne(),4);
        System.out.println(context.calculate());//2

        context=new Context(new NumberTwo(),5);
        System.out.println(context.calculate());//17

        context=new Context(new NumberThree(),5);
        System.out.println(context.calculate());//4
}

策略模式角色划分: Strategy 策略接口或者(抽象策略类),定义策略执行接口具体策略类 Context 上下文类,持有具体策略类的实例,并负责调用相关的算法。

策略模式优点

  • 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法(策略),并且可以灵活地增加新的算法(策略)。

  • 策略模式通过Context类提供了管理具体策略类(算法族)的办法。

  • 结合简单工厂模式和Annotation,策略模式可以方便的在不修改客户端代码的前提下切换算法(策略)。

策略模式缺点

  • 传统的策略模式实现方式中,客户端必须知道所有的具体策略类,并须自行显示决定使用哪一个策略类。

  • 策略模式可能创建很多具体策略类的实例。

 

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

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

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

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

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

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

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