策略模式-Java版

112 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

1、前言

昨天了解策略模式,并简单地用jQuery实现。今日再看策略模式,并尝试用Java实现。 首先看一下策略模式的使用场景(菜鸟教程如下介绍):

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

以项目中需要的计算为例:同比、环比、占比、门急诊人次数(门诊+急诊人次数)或者其他。 总共有四个计算方案。使用策略模式完成代码如下:

2、具体实现

2.1 实现一个策略接口

public interface Strategy { 
    public int doOperation(int num1, int num2); 
}

2.2 每种算法创建一个类,实现 Strategy接口

门急诊人次数类的指标计算

public class OperationSum implements Strategy{ 
    @Override public int doOperation(int num1, int num2) { 
        return num1 + num2; 
    } 
}

同比的计算

public class OperationTb implements Strategy{ 
    @Override public int doOperation(int num1, int num2) { 
        return (num1 - num2)/num2; 
    } 
}

环比的计算

public class OperationHb implements Strategy{ 
    @Override public int doOperation(int num1, int num2) { 
        return (num1 - num2)/num2; 
    } 
}

占比

public class OperationZb implements Strategy{ 
    @Override public int doOperation(int num1, int num2) { 
        return num1/num2; 
    } 
}

2.3 创建一个环境类

环境类的意义,就是用户和策略类的中间件,用户操作环境类来选择具体的策略。

public class Context { 
    private Strategy strategy; 
    public Context(Strategy strategy){ 
        this.strategy = strategy; 
    } 
    public int executeStrategy(int num1, int num2){ 
        return strategy.doOperation(num1, num2); 
    } 
}

2.4 API操作员的代码

public class ApiOperation { 
    public static void main(String[] args) { 
        Context context = new Context(new OperationSum()); 
        System.out.println("100 + 50 = " + context.executeStrategy(100, 50)); 
        context = new Context(new OperationTb()); 
        System.out.println("(10-5)/5" + context.executeStrategy(10, 5)); 
        context = new Context(new OperationHb()); 
        System.out.println("(10-5)/5" + context.executeStrategy(10, 5)); 
        context = new Context(new OperationZb()); 
        System.out.println("5/10" + context.executeStrategy(5, 10)); 
    }
}

3、思考

如果只是这样,为什么不能写一个静态类,把各种计算方式作为静态类的静态方法呢?调用的时候岂不是更简单?所以策略模式的优点在哪里?