在springboot项目中使用策略工厂模式

在springboot项目中使用策略工厂模式

策略接口类

java 复制代码
package cn.test.ext;

public interface ITestStrategy {

    void execTestMethod();
}

策略实现类

java 复制代码
package cn.test.ext.beanlife;

import cn.test.ext.ITestStrategy;
import cn.test.ext.MyStrategyFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

/**
 * InitializingBean
 * 实现该接口,你的bean可以在 spring容器初始化当前bean时 执行自定义逻辑
 *
 * 必须在afterPropertiesSet方法里写你自定义的执行逻辑
 */
@Slf4j
@Component
public class TestInitializingBean implements ITestStrategy, InitializingBean {

    private static String str ;

    //实现InitializingBean接口,必须重写afterPropertiesSet方法
    //这样当springboot启动加载TestInitializingBean时,会自动执行里边的afterPropertiesSet方法
    @Override
    public void afterPropertiesSet() throws Exception {
        //本方法里可以做一些初始化的操作,如设置类静态变量值 / 将类注册到策略工厂/ 执行一些其他方法或动作/...

        //设置类静态变量值
        str = "qwe123!";

        //将k1策略 (本类) 注册到 策略工厂里
        MyStrategyFactory.register("k1",this);
        log.info("注册了策略:{}到策略工厂里",this);
    }

    @Override
    public void execTestMethod() {
        log.info("start----执行k1策略...");

        System.err.println(str);
    }
}

策略工厂类

java 复制代码
package cn.test.ext;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 策略工厂
 */
@Component
@Slf4j
public class MyStrategyFactory {

    private static Map<String, ITestStrategy> strategyMap = new ConcurrentHashMap<>();


    /**
     * 将每个策略注册到策略工厂
     *
     * 利用策略类里的 InitializingBean 的afterPropertiesSet方法,
     * 来把策略类初始化到StrategyFactory 策略工厂里
     *
     * @param strategyCode String
     * @param itemStrategy IPersonAddrSimilarComputeHandleStrategy
     */
    public static void register(String strategyCode, ITestStrategy itemStrategy) {
        strategyMap.put(strategyCode, itemStrategy);
    }

    /**
     * 从策略工厂取出需要的策略
     * @param key
     * @return
     */
    public static ITestStrategy getReceiptHandleStrategy(String key) {
        for (String strate : strategyMap.keySet()) {
            if (StrUtil.equals(strate, key)) {
                //按key取出对应的策略类,来执行处理策略
                ITestStrategy strategy = strategyMap.get(key);
                log.info("拿到了策略:{}", strategy.getClass().getName());
                return strategy;
            }
        }
        log.info("没拿到对应的策略类,不存在 策略:{}", key);
        return null;
    }
}

策略上下文类

java 复制代码
package cn.test.ext;

import org.springframework.stereotype.Component;

@Component
public class MyStrategyContext {

    private ITestStrategy iTestStrategy;

    //1.按key get某个策略类
    public void getStrategyInstance(String key) {
        ITestStrategy strategyInstance = MyStrategyFactory.getReceiptHandleStrategy(key);
        this.iTestStrategy = strategyInstance;
    }

    //2.通过context执行该策略类里的方法
    public void execMethod(){
        if (iTestStrategy!=null){
            iTestStrategy.execTestMethod();
        }
    }
}
相关推荐
Lionel_SSL5 小时前
《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理
java·开发语言·jvm
记得开心一点嘛5 小时前
手搓Springboot
java·spring boot·spring
老华带你飞6 小时前
租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
java·数据库·小程序·vue·论文·毕设·租房系统管理平台
独行soc6 小时前
2025年渗透测试面试题总结-66(题目+回答)
java·网络·python·安全·web安全·adb·渗透测试
脑子慢且灵6 小时前
[JavaWeb]模拟一个简易的Tomcat服务(Servlet注解)
java·后端·servlet·tomcat·intellij-idea·web
华仔啊7 小时前
SpringBoot 中 6 种数据脱敏方案,第 5 种太强了,支持深度递归!
java·后端
异常驯兽师8 小时前
Spring 中处理 HTTP 请求参数注解全解析
java·spring·http
连合机器人9 小时前
晨曦中的守望者:当科技为景区赋予温度
java·前端·科技
AD钙奶-lalala9 小时前
idea新建的项目new 没有java class选项
java·ide·intellij-idea
sheji34169 小时前
【开题答辩全过程】以 12306候补购票服务系统为例,包含答辩的问题和答案
java·eclipse