Spring中实现策略模式的几种方式

news/2024/9/22 13:46:46/

Spring中实现策略模式的几种方式

一.背景

在写业务代码的时候,难免会遇到很多if-else,这个时候如果if-else不是很多可以用if-else。如果此时场景过多,太多的if-else会导致代码比较臃肿,所以这个时候就需要抽象化,将每个场景独立开来,定义一个顶层接口,不同场景有不同实现,这个时候策略模式就出现了。本文主要阐述工作中常用的实现策略模式的几种方式。

二.实现一

2.1 定义接口

java">package com.ljm.service;import com.ljm.constant.StrategyEnum;/*** @Author: ljm* @Date: 2024/4/29 15:09* @Version: v1.0.0* @Description: TODO**/
public interface IHandler {void handler();StrategyEnum getHandleStrategy();
}

2.2 定义枚举

java">package com.ljm.constant;/*** @Author: ljm* @Date: 2024/4/29 15:10* @Version: v1.0.0* @Description: TODO**/
public enum StrategyEnum {FIRST, SECOND, THIRD, FOUR
}

2.3 定义实现类

java">import com.ljm.constant.StrategyEnum;
import com.ljm.service.IHandler;
import org.springframework.stereotype.Service;/*** @Author: ljm* @Date: 2024/4/29 15:12* @Version: v1.0.0* @Description: TODO**/
@Service
public class FirstHandler implements IHandler {@Overridepublic void handler() {System.out.println("Execute First Handler");}@Overridepublic StrategyEnum getHandleStrategy() {return StrategyEnum.FIRST;}
}
java">package com.ljm.service.impl;import com.ljm.constant.StrategyEnum;
import com.ljm.service.IHandler;
import org.springframework.stereotype.Service;/*** @Author: ljm* @Date: 2024/4/29 15:12* @Version: v1.0.0* @Description: TODO**/
@Service
public class SecondHandler implements IHandler {@Overridepublic void handler() {System.out.println("Execute Second Handler");}@Overridepublic StrategyEnum getHandleStrategy() {return StrategyEnum.SECOND;}
}
java">package com.ljm.service.impl;import com.ljm.constant.StrategyEnum;
import com.ljm.service.IHandler;
import org.springframework.stereotype.Service;/*** @Author: ljm* @Date: 2024/4/29 15:12* @Version: v1.0.0* @Description: TODO**/
@Service
public class ThirdHandler implements IHandler {@Overridepublic void handler() {System.out.println("Execute Third Handler");}@Overridepublic StrategyEnum getHandleStrategy() {return StrategyEnum.THIRD;}
}
java">package com.ljm.service.impl;import com.ljm.constant.StrategyEnum;
import com.ljm.service.IHandler;
import org.springframework.stereotype.Service;/*** @Author: ljm* @Date: 2024/4/29 15:12* @Version: v1.0.0* @Description: TODO**/
@Service
public class FourHandler implements IHandler {@Overridepublic void handler() {System.out.println("Execute Four Handler");}@Overridepublic StrategyEnum getHandleStrategy() {return StrategyEnum.FOUR;}
}

2.4 定义策略工厂类

java">package com.ljm.service;import com.ljm.constant.StrategyEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.concurrent.ConcurrentHashMap;/*** @Author: ljm* @Date: 2024/4/29 15:16* @Version: v1.0.0* @Description: TODO**/
@Service
public class HandlerStrategyFactory {public final ConcurrentHashMap<StrategyEnum,IHandler> handlerStrategyMap = new ConcurrentHashMap<>();@Autowiredpublic HandlerStrategyFactory(List<IHandler> iHandlers){iHandlers.forEach(x -> handlerStrategyMap.put(x.getHandleStrategy(),x));}public IHandler  getHandleStrategy(StrategyEnum strategyEnum){return handlerStrategyMap.get(strategyEnum);}
}

2.5 测试

java">package com.ljm;import com.MyApplication;
import com.ljm.constant.StrategyEnum;
import com.ljm.service.HandlerStrategyFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/*** @Author: ljm* @Date: 2024/2/26 10:58* @Version: v1.0.0* @Description: TODO**/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MyApplication.class)
public class MyTest {@Autowiredprivate HandlerStrategyFactory handlerStrategyFactory;@Testpublic void testStrategy() {handlerStrategyFactory.getHandleStrategy(StrategyEnum.FIRST).handler();handlerStrategyFactory.getHandleStrategy(StrategyEnum.SECOND).handler();handlerStrategyFactory.getHandleStrategy(StrategyEnum.THIRD).handler();handlerStrategyFactory.getHandleStrategy(StrategyEnum.FOUR).handler();/* 测试结果Execute First HandlerExecute Second HandlerExecute Third HandlerExecute Four Handler*/}}

实现一主要是为IHandler接口新增一个用于区分使用何种策略的方法,再构建一个策略工厂类,利用构造器注入的方式,将Spring中的实现类与相应的枚举类绑定,在使用的时候只需要传入StrategyEnum相应的值就可以调用想调用的策略.

三.实现二

3.1 定义抽象类

java">package com.ljm.service;import com.ljm.constant.StrategyEnum;
import org.springframework.beans.factory.InitializingBean;/*** @Author: ljm* @Date: 2024/4/29 15:09* @Version: v1.0.0**/
public abstract class AbstractHandler implements InitializingBean {public  abstract void handler();public  abstract StrategyEnum getHandleStrategy();@Overridepublic void afterPropertiesSet() throws Exception {HandlerStrategyFactory.registerHandlerStrategy(this);}
}

3.2 定义枚举

java">package com.ljm.constant;/*** @Author: ljm* @Date: 2024/4/29 15:10* @Version: v1.0.0* @Description: TODO**/
public enum StrategyEnum {FIRST, SECOND, THIRD, FOUR
}

3.3 定义实现类

java">package com.ljm.service.impl;import com.ljm.constant.StrategyEnum;
import com.ljm.service.AbstractHandler;
import org.springframework.stereotype.Service;/*** @Author: ljm* @Date: 2024/4/29 15:12* @Version: v1.0.0* @Description: TODO**/
@Service
public class FirstHandler extends AbstractHandler {@Overridepublic void handler() {System.out.println("Execute First Handler");}@Overridepublic StrategyEnum getHandleStrategy() {return StrategyEnum.FIRST;}
}
java">package com.ljm.service.impl;import com.ljm.constant.StrategyEnum;
import com.ljm.service.AbstractHandler;
import org.springframework.stereotype.Service;/*** @Author: ljm* @Date: 2024/4/29 15:12* @Version: v1.0.0* @Description: TODO**/
@Service
public class SecondHandler extends AbstractHandler {@Overridepublic void handler() {System.out.println("Execute Second Handler");}@Overridepublic StrategyEnum getHandleStrategy() {return StrategyEnum.SECOND;}
}
java">package com.ljm.service.impl;import com.ljm.constant.StrategyEnum;
import com.ljm.service.AbstractHandler;
import org.springframework.stereotype.Service;/*** @Author: ljm* @Date: 2024/4/29 15:12* @Version: v1.0.0* @Description: TODO**/
@Service
public class ThirdHandler extends AbstractHandler {@Overridepublic void handler() {System.out.println("Execute Third Handler");}@Overridepublic StrategyEnum getHandleStrategy() {return StrategyEnum.THIRD;}
}
java">package com.ljm.service.impl;import com.ljm.constant.StrategyEnum;
import com.ljm.service.AbstractHandler;
import org.springframework.stereotype.Service;/*** @Author: ljm* @Date: 2024/4/29 15:12* @Version: v1.0.0* @Description: TODO**/
@Service
public class FourHandler extends AbstractHandler {@Overridepublic void handler() {System.out.println("Execute Four Handler");}@Overridepublic StrategyEnum getHandleStrategy() {return StrategyEnum.FOUR;}
}

3.4 定义策略工厂类

java">package com.ljm.service;import com.ljm.constant.StrategyEnum;import java.util.concurrent.ConcurrentHashMap;/*** @Author: ljm* @Date: 2024/4/29 15:16* @Version: v1.0.0* @Description: TODO**/
public class HandlerStrategyFactory {public static final ConcurrentHashMap<StrategyEnum, AbstractHandler> handlerStrategyMap = new ConcurrentHashMap<>();public static void registerHandlerStrategy(AbstractHandler handler) {handlerStrategyMap.put(handler.getHandleStrategy(), handler);}public static AbstractHandler getHandleStrategy(StrategyEnum strategyEnum) {return handlerStrategyMap.get(strategyEnum);}
}

3.5 测试

java">package com.ljm;import com.MyApplication;
import com.ljm.constant.StrategyEnum;
import com.ljm.service.HandlerStrategyFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/*** @Author: ljm* @Date: 2024/2/26 10:58* @Version: v1.0.0* @Description: TODO**/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MyApplication.class)
public class MyTest {@Testpublic void testStrategy() {HandlerStrategyFactory.getHandleStrategy(StrategyEnum.FIRST).handler();HandlerStrategyFactory.getHandleStrategy(StrategyEnum.SECOND).handler();HandlerStrategyFactory.getHandleStrategy(StrategyEnum.THIRD).handler();HandlerStrategyFactory.getHandleStrategy(StrategyEnum.FOUR).handler();/* 测试结果Execute First HandlerExecute Second HandlerExecute Third HandlerExecute Four Handler*/}}

实现二主要是为AbstractHandler抽象类实现InitializingBean接口,再对象初始化的时候将其注册到我们自己构建的策略工厂类中,此时的对象由Spring生成并与相应的枚举类绑定,在使用的时候只需要传入StrategyEnum相应的值就可以调用想调用的策略.


http://www.ppmy.cn/news/1450981.html

相关文章

从开通VPS到搭建宝塔面板全教程

因为学习需要&#xff0c;需要搭建一个宝塔面板。因为宝塔面板的可视化操作&#xff0c;丰富的功能和插件&#xff0c;极大的提高效率。想要学习搭建宝塔面板&#xff0c;最好单独整一台VPS&#xff0c;专门用于学习&#xff0c;以免影响其它VPS里面的功能。 一、开通VPS 因为…

link和@import的区别

Link 和 import 是 CSS 中的两种样式表引入方式。在网页设计中&#xff0c;样式表&#xff08;CSS&#xff09;是控制网页外观和布局的重要工具。 在引入样式表时&#xff0c;常见的方法包括使用 <link> 标签和 import 关键字。虽然它们都能实现相同的目标&#xff0c;但…

SQL数据库

一.什么是数据库 数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储。&#xff08;database 简称DB&#xff09; 数据库管理系统&#xff1a;管理数据库的大型软禁&#xff08;DataBase Management System 简称DBMS&#xff09; SQL&#xff1a;操作关系…

学习Rust的第22天:mini_grep第2部分

书接上文&#xff0c;在本文中&#xff0c;我们学习了如何通过将 Rust 程序的逻辑移至单独的库箱中并采用测试驱动开发 (TDD) 实践来重构 Rust 程序。通过在实现功能之前编写测试&#xff0c;我们确保了代码的可靠性。我们涵盖了基本的 Rust 概念&#xff0c;例如错误处理、环境…

Leetcode - 周赛395

目录 一&#xff0c;3131. 找出与数组相加的整数 I 二&#xff0c;3132. 找出与数组相加的整数 II 三&#xff0c;3133. 数组最后一个元素的最小值 四&#xff0c;3134. 找出唯一性数组的中位数 一&#xff0c;3131. 找出与数组相加的整数 I 本题本质就是求两个数组最小值的…

【跟马少平老师学AI】-【神经网络是怎么实现的】(六)过拟合问题

一句话归纳&#xff1a; 1&#xff09;过拟合问题&#xff1a; 图中的点为样本直线欠拟合曲线2过拟合 2&#xff09;迭代次数与拟合情况&#xff1a; 训练次数过多可能导致过拟合。 3&#xff09;正则化项法弱化过拟后问题&#xff1a; 加正则项&#xff0c;在最小化损失函数时…

Ieetcode——21.合并两个有序链表

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 合并两个有序链表我们的思路是创建一个新链表&#xff0c;然后遍历已知的两个有序链表&#xff0c;并比较其节点的val值&#xff0c;将小的尾插到新链表中&#xff0c;然后继续遍历&#xff0c;直到将该两个链表…

React 之 如何启动一个新的项目(六)

React本身是为构建SPA&#xff08;单页面应用&#xff09;而设计的。 想完全用 React 构建一个新的应用或网站&#xff0c;我们建议选择社区中流行的、由 React 驱动的框架。 生产级的 React 框架 1. Next.js Next.js 的页面路由 是一个全栈的 React 框架。它用途广泛&#x…