策略模式在springboot中的使用

策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。

策略模式通常由以下三个角色组成:

  • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。它定义了一个公共的算法接口,以约束所有具体的策略类,这些策略类将有不同的实现。

  • 具体策略(Concrete Strategy)角色:这是实现了抽象策略角色的类,每一个具体策略类都封装了实现特定算法的细节。

  • 环境(Context)角色:持有一个对抽象策略角色的引用,客户端通过环境角色调用其操作的策略。环境角色负责在运行时将具体策略角色动态地设置到其引用上,以保证对客户端的透明性。

优点

  • 算法与使用分离:策略模式使得算法和使用算法的客户端代码分离,两者可以独立变化而互不影响。

  • 易于扩展:新的策略只需要实现对应的接口或继承抽象类,然后在使用策略的客户端中动态地设置即可,符合开闭原则。

  • 避免多重条件选择:策略模式通过把不同的算法封装到不同的策略类中,可以避免在客户端代码中出现复杂的条件语句。

  • 算法可复用:不同的策略类之间可以相互替换,提高了代码的复用性。

缺点

  • 客户端必须知道所有的策略类:客户端需要知道所有可用的策略类,并自行决定使用哪一个策略类。这增加了客户端的复杂性。
  • 策略类数量可能过多:如果系统中存在大量的策略,那么就需要创建大量的策略类,增加了系统的复杂性。

应用场景

策略模式的应用场景包括但不限于:

复制代码
多个类只区别在表现行为不同:这种情况下可以使用策略模式,在运行时动态选择具体要执行的行为。

需要在不同情况下使用不同的策略:策略可能在未来用其他方式来实现,这种情况下策略模式提供了灵活性。

对客户隐藏具体策略的实现细节:策略模式允许将算法的使用与算法的实现分离,客户端只需要知道策略接口,而不需要关心具体的实现细节。

示例

策略模式通常用于处理复杂的业务场景,例如计算个人所得税时,不同的国家可能有不同的算法。通过策略模式,我们可以将每种算法封装成一个策略类,然后在运行时根据用户所在的国家选择相应的策略类进行计算。

1.抽象策略类

java 复制代码
public interface Strategy {  
    int doOperation(int num1, int num2);  
}

2.策略实现

java 复制代码
@Component("add")
public class OperationAdd implements Strategy {  

    @Override  

    public int doOperation(int num1, int num2) {  

        return num1 + num2;  

    }  

}  

  
@Component("subtraction")
public class OperationSubtract implements Strategy {  

    @Override  

    public int doOperation(int num1, int num2) {  

        return num1 - num2;  

    }  

}  

  

3.策略选择器

java 复制代码
@Component
public class Select {  
    @Resource
    private Map<String,Strategy> selectorMap;
    public  Strategy select(String  type){
        return  selectorMap.get(type);
    }
}

5.测试类

java 复制代码
    Strategy strategy = Select.select("add");
    int t= strategy.doOperation(1,2);
相关推荐
韩师傅33 分钟前
前端开发消亡史:AI也无法掩盖没有设计创造力的真相
前端·人工智能·后端
栈与堆1 小时前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
superman超哥1 小时前
双端迭代器(DoubleEndedIterator):Rust双向遍历的优雅实现
开发语言·后端·rust·双端迭代器·rust双向遍历
1二山似1 小时前
crmeb多商户启动swoole时报‘加密文件丢失’
后端·swoole
马卡巴卡1 小时前
Java CompletableFuture 接口与原理详解
后端
神奇小汤圆2 小时前
Java线程协作工具:CountDownLatch 、CyclicBarrier、Phaser、Semaphore 、Exchanger
后端
gelald2 小时前
ReentrantLock 学习笔记
java·后端
计算机学姐2 小时前
基于SpringBoot的校园资源共享系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·spring·信息可视化
廋到被风吹走2 小时前
【Spring】Spring Boot 配置管理深度指南:Profile、类型安全与加密
spring boot·安全·spring
J_liaty2 小时前
RabbitMQ面试题终极指南
开发语言·后端·面试·rabbitmq