服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - JAVA设计模式中的策略模式你了解吗

JAVA设计模式中的策略模式你了解吗

2022-10-25 15:12Asparrow Java教程

这篇文章主要为大家详细介绍了JAVA设计模式中的策略模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

策略模式

世界上本没有模式;

一些程序老鸟在长时间的编程工作总结出高效的代码写法被后世推崇;

并整理出固定的写法规范,这个写法规范目前收录有23种

这些规范被称之为 --> 设计模式

策略模式是什么

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

策略模式的使用场景

Q: 我们知道策略模式最重要的就是封装变化点,那边对于变化点我们一般用什么处理呢?

A: 是的 我们一般用if - else 处理需要对变化点做出不同的反应,策略模式就可以替换代码中的if - else操作

其实策略模式主要就是替换代码中的if - else操作,当然也可以是switch

Q: 那我就有个疑问了,我就喜欢写if - else switch,我为什么要用策略模式呢,难道就是为了看起来牛逼吗?

A: 首先并不是所有的if - else switch 都适合使用策略模式改造,策略模式可谓是把双刃剑,使用时也会带来一些问题,比如说实现类膨胀;

Q: 既然是把双刃剑,那么如何判断是否应该使用策略模式呢?

A: 策略模式对标的是代码中的if - else操作,主要针对if - else 的嵌套层级和每个if - else下的代码处理行数;

(你的if - else 判断多余两次) && (每个if - else 下的处理代码超过5行) -> 建议使用策略模式优化代码

策略模式实践

我们使用一个简单的计算器需求来模拟策略模式的使用场景

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
 * 计算器
 *
 * @author cans
 * @date 2022/3/26
 **/
public class Calculator {
 
    /**
     * 计算数字
     *
     * @param num1     参数1
     * @param num2     参数2
     * @param operator 操作算法
     * @return
     */
    public Integer calculate(Integer num1, Integer num2, String operator) {
 
        if(operator.equals("+")){
            return num1 + num2;
        }else if(operator.equals("-")){
            return num1 - num2;
        }
        throw new RuntimeException("无效的操作算法");
    }
}

以上代码使用if-else代码实现了一个简单的计算器代码,实现也完全没大问题,但是也存在弊端

1.扩展性不好,比如扩展乘法需要在代码中追加if-else

2.一两个if-else还好如果操作算法多了以后影响代码的可读性

下面使用策略模式对这个代码进行优化

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
 * 使用策略模式进行优化
 *
 * @author cans
 * @date 2022/3/26
 **/
public class Calculator2 {
 
    private  Map<String,CalculatorOperator> calculatorOperatorMap = new HashMap<>();
 
    public Calculator2(){
        CalculatorOperatorAddImpl calculatorOperatorAdd = new CalculatorOperatorAddImpl();
        CalculatorOperatorSubImpl calculatorOperatorSub = new CalculatorOperatorSubImpl();
        calculatorOperatorMap.put(calculatorOperatorAdd.getOperator(),calculatorOperatorAdd);
        calculatorOperatorMap.put(calculatorOperatorSub.getOperator(),calculatorOperatorSub);
    }
 
    /**
     * 计算数字
     *
     * @param num1     参数1
     * @param num2     参数2
     * @param operator 操作算法
     * @return
     */
    public Integer calculate(Integer num1, Integer num2, String operator) {
        CalculatorOperator calculatorOperator = calculatorOperatorMap.get(operator);
        if(calculatorOperator == null){
            throw new RuntimeException("无效的操作算法:" + operator);
        }
        return calculatorOperator.calculate(num1, num2);
    }
 
    /**
     * 支持的算法枚举
     */
    public enum Operator{
        ADD("+"),SUB("-");
 
        private String operator;
 
        Operator(String operator){
            this.operator = operator;
        }
 
        public String getOperator() {
            return operator;
        }
 
        public void setOperator(String operator) {
            this.operator = operator;
        }
    }
 
    /**
     * 计算顶层接口
     */
    public interface CalculatorOperator{
        /**
         * 算法操作
         * @return
         */
        public String getOperator();
 
        /**
         * 计算方法
         *
         * @param num1 参数1
         * @param num2 参数2
         * @return
         */
        public Integer calculate(Integer num1, Integer num2);
    }
 
    /**
     * 加法实现
     */
    public class CalculatorOperatorAddImpl implements CalculatorOperator{
 
        @Override
        public String getOperator() {
            return Operator.ADD.getOperator();
        }
 
        /**
         * 加法操作
         * @param num1 参数1
         * @param num2 参数2
         * @return
         */
        public Integer calculate(Integer num1, Integer num2) {
         return num1 + num2;
        }
    }
 
    /**
     * 减法实现
     */
    public class CalculatorOperatorSubImpl implements CalculatorOperator{
 
        @Override
        public String getOperator() {
            return Operator.SUB.getOperator();
        }
 
        /**
         * 加法操作
         * @param num1 参数1
         * @param num2 参数2
         * @return
         */
        public Integer calculate(Integer num1, Integer num2) {
            return num1 - num2;
        }
    }
 
    @Test
    public void testCalculate(){
        System.out.println("1+1 = : " + calculate(1,1,"+"));
        System.out.println("1-1 = : " + calculate(1,1,"-"));
        System.out.println("1*1 = : " + calculate(1,1,"*"));
    }
}

策略模式以后类比较多,画个简单的图方便理解

JAVA设计模式中的策略模式你了解吗

其实这里结合工厂模式更好用,使用Map calculatorOperatorMap其实也一个意思;

可以看到使用策略模式以后类膨胀非常厉害,从之前1个类膨胀到4个类,但是扩展性得到了大大的提升,后续的算法扩展只需要在枚举中新增枚举类,实现响应的算法实现即可;

综上示例策略模式优势如下几点:

1.扩展性提升;

2.主体业务逻辑更清晰;

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!   

原文链接:https://blog.csdn.net/shencange/article/details/122141254

延伸 · 阅读

精彩推荐
  • Java教程Java读取文件方法汇总

    Java读取文件方法汇总

    这篇文章主要为大家详细介绍了Java读取文件方法,按字节读取文件内容、按字符读取文件内容、随机读取文件内容等,具有一定的参考价值,感兴趣的小伙...

    Java开发-搁浅5012020-07-20
  • Java教程Java优化if-else代码的实战记录

    Java优化if-else代码的实战记录

    开发中经常会根据不同的参数判断走不同的逻辑业务,我们常用的方法就是if/else嵌套使用,导致每增加一个需求就加一个if,慢慢的就会发现自己写的代码中出...

    jeremylai79672022-01-06
  • Java教程Java parseInt解释加方法示例

    Java parseInt解释加方法示例

    使用此方法得到的原始数据类型的一个特定的字符串。 parseXxx()是一个静态方法,可以有一个参数或两个 ...

    java教程网5352019-10-18
  • Java教程理解Spring中的依赖注入和控制反转

    理解Spring中的依赖注入和控制反转

    这篇文章主要介绍了理解Spring中的依赖注入和控制反转,具有一定参考价值,需要的朋友可以了解下。...

    jinnianshilongnian10982021-02-20
  • Java教程Java数据结构之栈的线性结构详解

    Java数据结构之栈的线性结构详解

    从数据结构上看栈和队列都是线性表,不过是两种特殊的线性表,栈只允许在的一端进行插人或删除操作,而队列只允许在表的一端进行插人操作、而在另一端...

    Cbw7722021-11-08
  • Java教程Java Json字符串的双引号("")括号如何去掉

    Java Json字符串的双引号("")括号如何去掉

    这篇文章主要介绍了Java Json字符串的双引号("")括号如何去掉?具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    点击确认后开始10252020-09-13
  • Java教程Servlet+JavaBean+JSP打造Java Web注册与登录功能

    Servlet+JavaBean+JSP打造Java Web注册与登录功能

    比作MVC的话,控制器部分采用Servlet来实现,模型部分采用JavaBean来实现,而大部分的视图采用Jsp页面来实现,接下来我们就来详细看看如何用Servlet+JavaBean+JSP打...

    xing3342020-05-05
  • Java教程jxl操作excel写入数据不覆盖原有数据示例

    jxl操作excel写入数据不覆盖原有数据示例

    网上很多例子,都是用Jxl读或者写excel,本文实现的功能就是将数据源in.xls的第几行第几列数据写入到out.xls的第几行第几列,不覆盖out.xls其他原有的数据。...

    java教程网6092019-11-15