• 二十三种设计模式全面解析-当你的代码需要多种算法时,策略模式是你的救星!



    1、什么是策略模式?

    策略模式是一种行为型设计模式,它允许在运行时更改对象的行为。这种模式通过将算法与使用算法的代码解耦,提供了一种动态选择不同算法的方法。在本文中,我将介绍策略模式的原理、适用场景、技术要点以及以JAVA实现的案例代码。


    2、原理介绍

    策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。


    3、适用场景

    策略模式适用于以下场景:

    • 在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
    • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
    • 如果一个系统需要动态地在几种算法中选择一种。
    • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

    4、技术要点

    策略模式包含以下几个核心角色:

    • 环境(Context):维护一个对策略对象的引用,负责将客户端请求委派给具体的策略对象执行。环境类可以通过依赖注入、简单工厂等方式来获取具体策略对象。
    • 抽象策略(Abstract Strategy):定义了策略对象的公共接口或抽象类,规定了具体策略类必须实现的方法。
    • 具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。

    5、案例代码

    public interface Strategy {
        public int doOperation(int num1, int num2);
    }
    
    public class OperationAdd implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
            return num1 + num2;
        }
    }
    
    public class OperationSubtract implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
            return num1 - num2;
        }
    }
    
    public class OperationMultiply implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
            return num1 * num2;
        }
    }
    
    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);
        }
    }
    
    public class StrategyPatternDemo {
        public static void main(String[] args) {
            Context context = new Context(new OperationAdd());
            System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
    
            context = new Context(new OperationSubtract());
            System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    
            context = new Context(new OperationMultiply());
            System.out.println("10 * 5 = " + context.executeStrategy(10, 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    这个案例代码展示了如何使用策略模式来实现不同的算法。


    在这个例子中,我们定义了一个 Strategy 接口,它有一个 doOperation 方法,这个方法接受两个整数作为参数,并返回它们的运算结果。


    然后我们定义了三个具体的策略类,分别实现了加法、减法和乘法运算。


    最后,我们定义了一个 Context 类,它维护了一个对 Strategy 对象的引用,并提供了一个 executeStrategy 方法,这个方法接受两个整数作为参数,并调用 Strategy 对象的 doOperation 方法来执行相应的运算。


    StrategyPatternDemo 类中,我们创建了一个 Context 对象,并分别使用加法、减法和乘法策略来执行不同的运算。

    这个案例代码展示了如何使用策略模式来实现不同的算法,并且可以在运行时动态地选择不同的算法,而不需要修改客户端代码。


    总结:

    策略模式是一种非常有用的设计模式,它可以帮助我们在运行时更改对象的行为。

    然而,设计模式世界中还有许多其他精彩的故事等待我们探索。在下一篇博文中,我们将深入研究另一个引人入胜的设计模式,为你带来更多惊喜。敬请期待!

    好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。


  • 相关阅读:
    Python is not set from command line or npm configuration 报错解决
    智能优化与机器学习结合算法实现时序数据预测matlab代码清单
    CSS小计
    C++移动构造和移动赋值函数
    【试题037】逻辑非!例题2
    【设计模式】概述
    这篇文章告诉你时光穿梭机特效从年轻变老制作软件
    什么是多维数组?怎样定义多维数组?
    保险丝的工作原理
    刷题记录(NC14399 素数判断,NC235228 素数的个数,NC23050 华华对月月的忠诚)
  • 原文地址:https://blog.csdn.net/lizhong2008/article/details/134477500