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

ops/2024/9/24 10:56:04/

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/ops/25166.html

相关文章

开发文档、PHP身份核验接口,三要素实名认证接口

在这个数字时代&#xff0c;每一步的安全都至关重要。想象一下&#xff0c;一个简单、高效又安全的解决方案&#xff0c;让您的业务与客户之间建立起坚不可摧的信任桥梁&#xff0c;那便是翔云身份证三要素实名认证接口。 翔云身份证实名认证接口&#xff0c;实时联网&#xf…

流程控制语句

06、特殊的循环控制语句 **break&#xff1a;**作用于循环&#xff0c;表示跳出整个循环 案例&#xff1a;循环录入麻生希同学5门课的成绩并计算平均分&#xff0c;如果某分数录入为负&#xff0c;停止录入并提示。 **continue&#xff1a;**作用于循环&#xff0c;表示跳过…

优化SQL的方法

来自组内分享&#xff0c;包含了比较常使用到的八点&#xff1a; 避免使用select * union all代替union 小表驱动大表 批量操作 善用limit 高效的分页 用连接查询代替子查询 控制索引数量 一、避免使用select * 消耗数据库资源 消耗更多的数据库服务器内存、CPU等资源。 消…

Python发送digest认证的请求:requests.auth.HTTPDigestAuth/httpx.DigestAuth

近日在做摄像头接口的调试&#xff0c;需要用到Digest认证&#xff0c;经过试验&#xff0c;代码如下&#xff1a; 一、同步版(pip install requests) import requests from requests.auth import HTTPDigestAuthhost https://192.168.0.2 path /api/xxx path2 /another/a…

Git 核心概念与实操

这里写目录标题 1 版本回退2 工作区、暂存区、本地仓库、远程仓库3 分支合并3.1 Fast-forward3.2 Recursive3.3 Ours & Theirs 4 处理冲突5 git stash 存储工作区 参考&#xff1a;https://www.liaoxuefeng.com/wiki/896043488029600 1 版本回退 原文链接&#xff1a;http…

C++ 核心编程(2)

4.6.8 菱形继承 #include<iostream> #include <bits/stdc.h> using namespace std; //菱形继承 //动物类 class Animal{ public:int mAge; }; //羊 class Sheep : public Animal{}; //驼 class Tuo : public Animal{}; //羊驼 class SheepTuo:public Sheep,pu…

Json-server 模拟后端接口

json-server&#xff0c;模拟rest接口&#xff0c;自动生成增删改查接口。(官网地址&#xff1a;json-server - npm) 使用方法&#xff1a; 1. 安装json-server&#xff0c;npm i json-server -g 2. 创建json文件&#xff0c;文件中存储list数据&#xff0c;db.json {"…

实施运维工程师面试题

实施工程师面试题 (一)电脑网络,软硬件以及软件实施工程师要掌握的基本常识 两台电脑都在同一个网络环境中,A电脑访问不到B电脑的共享文件。此现象可能是哪些方面所至?如何处理?首先你要确定是不是在一个工作组内,只有在一个工作组内才可以共享文件,查看共享服务是否被…