Java设计模式之《策略模式》

目录

1、策略介绍

2、特点

2.1、优缺点

2.2、和工厂模式对比

3、实现


前言


1、策略介绍

策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。

如下所示:

策略模式使得算法可以独立于使用它的客户端而变化。


2、特点

2.1、优缺点

1、策略模式优点:

策略类之间可以自由切换:

由于策略类都实现同一个接口,所以使它们之间可以自由切换。避免使用多重条件选择语句(if else),充分体现面向对象设计思想。

易于扩展:

增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合"开闭原则"。

2、策略模式缺点:

客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式将造成产生很多策略类。

2.2、和工厂模式对比

如下所示:


3、实现

下面是策略模式的一个简单实现示例:

假设我们有一个计算器应用程序,可以执行不同的运算策略(例如加法、减法、乘法、除法)。我们可以使用策略模式来实现这些运算。

1、定义策略接口:

java 复制代码
public interface OperationStrategy {
    int execute(int a, int b);
}

2、实现具体策略:

java 复制代码
public class AdditionStrategy implements OperationStrategy {
    @Override
    public int execute(int a, int b) {
        return a + b;
    }
}

public class SubtractionStrategy implements OperationStrategy {
    @Override
    public int execute(int a, int b) {
        return a - b;
    }
}

public class MultiplicationStrategy implements OperationStrategy {
    @Override
    public int execute(int a, int b) {
        return a * b;
    }
}

public class DivisionStrategy implements OperationStrategy {
    @Override
    public int execute(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("Cannot divide by zero");
        }
        return a / b;
    }
}

3、使用策略上下文:

java 复制代码
public class CalculatorContext {
    private OperationStrategy strategy;

    public void setStrategy(OperationStrategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int a, int b) {
        return strategy.execute(a, b);
    }
}

4、客户端代码:

java 复制代码
public class StrategyPatternDemo {
    public static void main(String[] args) {
        CalculatorContext calculator = new CalculatorContext();

        calculator.setStrategy(new AdditionStrategy());
        System.out.println("Addition: " + calculator.executeStrategy(5, 3));

        calculator.setStrategy(new SubtractionStrategy());
        System.out.println("Subtraction: " + calculator.executeStrategy(5, 3));

        calculator.setStrategy(new MultiplicationStrategy());
        System.out.println("Multiplication: " + calculator.executeStrategy(5, 3));

        calculator.setStrategy(new DivisionStrategy());
        System.out.println("Division: " + calculator.executeStrategy(6, 3));
    }
}

总结

策略模式通过将算法封装在独立的策略类中,实现了算法的解耦和动态选择。它提高了代码的灵活性和可维护性,特别是在需要频繁切换或扩展算法的场景中。


参考文章:

1、策略模式适用场景与具体实例解析_策略模式应用场景-CSDN博客文章浏览阅读1.4k次,点赞5次,收藏8次。策略模式在多种场合下都能发挥其优势,尤其在需要根据不同条件或策略选择不同算法的场景中。下面是几个具体的适用场景及其对应的实例,以帮助进一步理解策略模式的实际应用。_策略模式应用场景https://blog.csdn.net/h356363/article/details/140408049?ops_request_misc=%257B%2522request%255Fid%2522%253A%25224c78c5b6a3ccda22d9db323028f3b03c%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=4c78c5b6a3ccda22d9db323028f3b03c&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-140408049-null-null.142^v102^control&utm_term=%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F%E7%9A%84%E5%AE%9E%E9%99%85%E5%BA%94%E7%94%A8&spm=1018.2226.3001.4187

相关推荐
xiaogai_gai2 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
打工仔折腾 AI2 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
小蒜学长4 小时前
微信小程序-高校自习室管理系统(代码+数据库+LW)
java·spring boot·后端·微信小程序·自习室管理
日和雫4 小时前
面向对象与面向过程,谁才是“银弹”?
设计模式
鸥梨菌Honevid4 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet
瑞克-桑切斯4 小时前
真实企业场景 运维安全与管理
java·网络·github
老板一杯拿铁5 小时前
Java 八股文面试详解:从基础到进阶的全面梳理
java·面试
const_qiu5 小时前
第 2.5 章 2.5.4-2.5.5:JWT 双 Token 与声明式权限守卫
java·人工智能
bug菌5 小时前
一个周末就想把短链服务推到 10 万 QPS,真能靠加 Redis 做到吗?
java·redis·go
撸串-研究生5 小时前
springboot福利院管理系统73979
java·spring boot·后端·福利院管理系统