【设计模式】策略模式(行为型)⭐⭐

文章目录

  • 1.概念
    • [1.1 什么是策略模式](#1.1 什么是策略模式)
    • [1.2 优点与缺点](#1.2 优点与缺点)
  • 2.实现方式
  • [3. Java 哪些地方用到了策略模式](#3. Java 哪些地方用到了策略模式)
  • [4. Spring 哪些地方用到了策略模式](#4. Spring 哪些地方用到了策略模式)

1.概念

1.1 什么是策略模式

它允许用户在不修改现有对象的代码的情况下向对象添加新的功能;这种模式是通过创建一个包含该对象的包装对象来实现的,从而扩展该对象的功能。

1.2 优点与缺点

优点 :

1.灵活性:策略模式提供了在运行时选择算法或行为的能力,使得算法或行为的变化独立于使用它们的客户。

2.扩展性:通过添加新的策略类,可以很容易地扩展系统的行为,符合开闭原则。

3.简化了代码:策略模式将算法封装在单独的类中,从而简化了上下文类,使得功能划分更加清晰。

4.避免使用多重条件选择语句:策略模式可以帮助避免复杂的条件语句,如多重if-else或switch语句,使代码更加优雅。

5.可维护性:由于算法被封装在不同的类中,因此代码更容易维护和理解。

缺点 :

1.增加了系统的复杂性:策略模式引入了更多的类,这可能会增加系统的复杂性,尤其是在策略数量较多时。

2.客户端必须知道不同的策略:客户端必须知道可用的策略,并决定使用哪一个,这可能会导致客户端代码的复杂性增加。

3.策略之间的依赖性:如果策略之间有依赖关系,可能会导致系统变得更加复杂。

4.性能问题:如果策略对象的创建和销毁开销较大,可能会对性能产生影响,尤其是在频繁切换策略的情况下。

5.管理策略类:随着策略数量的增加,管理这些策略类可能会变得困难,尤其是在大型系统中。

2.实现方式

① 定义策略接口

java 复制代码
public interface Strategy {
    void execute();
}

②创建实现了这个接口的具体策略类

java 复制代码
public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing Strategy A");
    }
}

public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing Strategy B");
    }
}

③ 创建一个上下文类,它持有一个策略对象的引用,并通过这个引用调用执行方法

java 复制代码
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

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

    public void executeStrategy() {
        strategy.execute();
    }
}

④ 在客户端代码中使用上下文类和不同的策略

java 复制代码
public class Client {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStrategyA());
        context.executeStrategy(); // 输出: Executing Strategy A

        context.setStrategy(new ConcreteStrategyB());
        context.executeStrategy(); // 输出: Executing Strategy B
    }
}

3. Java 哪些地方用到了策略模式

排序算法 :Java的Collections.sort()方法可以接受一个Comparator接口的实例,这个接口就是一个策略模式的应用。你可以为不同的排序需求提供不同的Comparator实现。
Java I/O :Java的I/O类库中,InputStream、OutputStream、Reader和Writer等抽象类可以看作是策略模式的上下文,而它们各自的实现类(如FileInputStream、BufferedInputStream等)则充当具体的策略。
JDBC :JDBC(Java Database Connectivity)使用策略模式来允许不同的数据库驱动实现。DriverManager类根据URL来选择合适的Driver实现,而不同的Driver实现则对应不同的数据库连接策略。
命令行处理 :例如Apache Commons CLI或其他命令行处理库,它们允许你定义不同的命令行选项处理策略。
设计模式 :许多设计模式的实现都可能用到策略模式,比如工厂模式、命令模式等。
算法框架 :在算法框架中,策略模式可以用来根据不同的输入或条件选择不同的算法实现。
业务规则引擎 :在业务规则引擎中,策略模式可以用来根据不同的业务规则选择不同的处理策略。
策略模式在Spring框架中的应用:Spring框架中的许多地方都使用了策略模式,例如,事务管理、数据源选择、消息中间件的连接等。

4. Spring 哪些地方用到了策略模式

事务管理 :Spring的事务管理支持多种事务管理策略,如编程式事务管理(使用TransactionTemplate)和声明式事务管理(使用@Transactional注解)。这些不同的策略可以通过配置来切换,而不需要修改业务代码。
数据源选择 :在Spring中,你可以配置多个数据源,并通过TransactionManager和DataSource接口来切换不同的数据源实现。
消息中间件的连接 :Spring支持多种消息中间件,如JMS、RabbitMQ、Kafka等。通过策略模式,Spring允许你根据需要选择不同的消息中间件连接策略。
AOP(面向切面编程) :Spring AOP允许你定义切面(Aspect)和通知(Advice),这些可以看作是策略模式的具体策略。你可以根据需要选择不同的通知类型(如前置通知、后置通知等)来增强目标对象的行为。
事件驱动编程 :Spring的事件驱动编程模型允许你定义不同的事件监听器(Listener),这些监听器可以看作是处理不同事件的策略。
资源访问 :Spring的Resource接口允许你以统一的方式访问不同类型的资源(如文件系统、类路径、URL等),而具体的Resource实现则充当不同的访问策略。
Bean的作用域 :Spring允许你为Bean定义不同的作用域(如单例、原型、请求、会话等),这些作用域可以看作是不同的生命周期管理策略。
数据绑定:Spring的WebDataBinder允许你为不同的数据绑定场景定义不同的数据转换和格式化策略。

相关推荐
LucianaiB2 分钟前
如何做好一份优秀的技术文档:专业指南与最佳实践
android·java·数据库
面朝大海,春不暖,花不开26 分钟前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
得过且过的勇者y27 分钟前
Java安全点safepoint
java
夜晚回家1 小时前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组1 小时前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin1801 小时前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
wtg44521 小时前
使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试
java
白宇横流学长2 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
fat house cat_2 小时前
【redis】线程IO模型
java·redis
stein_java3 小时前
springMVC-10验证及国际化
java·spring