Spring策略模式

This commit is contained in:
2021-12-27 21:55:03 +08:00
parent dd1da27b7c
commit e20286c47d
10 changed files with 289 additions and 2 deletions

8
.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
.idea
.classpath
.project
*.iml
target/
.DS_Store
.gitattributes
log/

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />

View File

@@ -0,0 +1,12 @@
package top.fjy8018.designpattern.pattern.behavior.strategy.spring;
/**
* @author F嘉阳
* @date 2021-12-27 21:37
*/
public class CommonPairResponse<T, R> {
public static <T, R> CommonPairResponse<T, R> success(String s, Object o) {
return null;
}
}

View File

@@ -0,0 +1,45 @@
package top.fjy8018.designpattern.pattern.behavior.strategy.spring;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.Serializable;
/**
* HSF 模式的提交
*
* @author F嘉阳
* @date 2021-12-27 21:43
*/
@Slf4j
@Component
public class FormHsfSubmitHandler implements FormSubmitHandler<Serializable> {
/**
* 获得提交类型(返回值也可以使用已经存在的枚举类)
*
* @return 提交类型
*/
@Override
public String getSubmitType() {
return "hsf";
}
/**
* 处理表单提交请求
*
* @param request 请求
* @return 响应left 为返回给前端的提示信息right 为业务值
*/
@Override
public CommonPairResponse<String, Serializable> handleSubmit(FormSubmitRequest request) {
log.info("HSF 模式提交userId={}, formInput={}", request.getUserId(), request.getFormInput());
// 进行 HSF 泛化调用,获得业务方返回的提示信息和业务数据
CommonPairResponse<String, Serializable> response = hsfSubmitData(request);
return response;
}
private CommonPairResponse<String, Serializable> hsfSubmitData(FormSubmitRequest request) {
return null;
}
}

View File

@@ -0,0 +1,43 @@
package top.fjy8018.designpattern.pattern.behavior.strategy.spring;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 模型输入时的提交
*
* @author F嘉阳
* @date 2021-12-27 21:40
*/
@Slf4j
@Component
public class FormModelSubmitHandler implements FormSubmitHandler<Long> {
/**
* 获得提交类型(返回值也可以使用已经存在的枚举类)
*
* @return 提交类型
*/
@Override
public String getSubmitType() {
return "model";
}
/**
* 处理表单提交请求
*
* @param request 请求
* @return 响应left 为返回给前端的提示信息right 为业务值
*/
@Override
public CommonPairResponse<String, Long> handleSubmit(FormSubmitRequest request) {
log.info("模型提交userId={}, formInput={}", request.getUserId(), request.getFormInput());
// 模型创建成功后获得模型的 id
Long modelId = createModel(request);
return CommonPairResponse.success("模型提交成功!", modelId);
}
private Long createModel(FormSubmitRequest request) {
// 创建模型的逻辑
return 123L;
}
}

View File

@@ -0,0 +1,39 @@
package top.fjy8018.designpattern.pattern.behavior.strategy.spring;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.Serializable;
/**
* 预览表单时的提交
*
* @author F嘉阳
* @date 2021-12-27 21:39
*/
@Slf4j
@Component
public class FormPreviewSubmitHandler implements FormSubmitHandler<Serializable> {
/**
* 获得提交类型(返回值也可以使用已经存在的枚举类)
*
* @return 提交类型
*/
@Override
public String getSubmitType() {
return "preview";
}
/**
* 处理表单提交请求
*
* @param request 请求
* @return 响应left 为返回给前端的提示信息right 为业务值
*/
@Override
public CommonPairResponse<String, Serializable> handleSubmit(FormSubmitRequest request) {
log.info("预览模式提交userId={}, formInput={}", request.getUserId(), request.getFormInput());
return CommonPairResponse.success("预览模式提交数据成功!", null);
}
}

View File

@@ -0,0 +1,26 @@
package top.fjy8018.designpattern.pattern.behavior.strategy.spring;
import java.io.Serializable;
/**
* 表单提交处理器
*
* @author F嘉阳
* @date 2021-12-27 21:36
*/
public interface FormSubmitHandler<R extends Serializable> {
/**
* 获得提交类型(返回值也可以使用已经存在的枚举类)
*
* @return 提交类型
*/
String getSubmitType();
/**
* 处理表单提交请求
*
* @param request 请求
* @return 响应left 为返回给前端的提示信息right 为业务值
*/
CommonPairResponse<String, R> handleSubmit(FormSubmitRequest request);
}

View File

@@ -0,0 +1,57 @@
package top.fjy8018.designpattern.pattern.behavior.strategy.spring;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* 策略的简单工厂
* 让 FormSubmitHandlerFactory 实现 InitializingBean 接口,在 afterPropertiesSet
* 方法中,基于 Spring 容器将所有 FormSubmitHandler 自动注册到 FORM_SUBMIT_HANDLER_MAP
* 从而 Spring 容器启动完成后, getHandler 方法可以直接通过 submitType
* 来获取对应的表单提交处理器
* <p>
* Factory 只负责获取 HandlerHandler 只负责处理具体的提交Service 只负责逻辑编排,
* 从而达到功能上的 “低耦合高内聚”。
*
* @author F嘉阳
* @date 2021-12-27 21:44
*/
@Component
public class FormSubmitHandlerFactory implements InitializingBean, ApplicationContextAware {
private static final Map<String, FormSubmitHandler<Serializable>> FORM_SUBMIT_HANDLER_MAP = new HashMap<>(8);
private ApplicationContext appContext;
/**
* 根据提交类型获取对应的处理器
*
* @param submitType 提交类型
* @return 提交类型对应的处理器
*/
public FormSubmitHandler<Serializable> getHandler(String submitType) {
return FORM_SUBMIT_HANDLER_MAP.get(submitType);
}
@Override
public void afterPropertiesSet() {
// 将 Spring 容器中所有的 FormSubmitHandler 注册到 FORM_SUBMIT_HANDLER_MAP
appContext.getBeansOfType(FormSubmitHandler.class)
.values()
.forEach(handler -> FORM_SUBMIT_HANDLER_MAP.put(handler.getSubmitType(), handler));
}
@Override
public void setApplicationContext(@NonNull ApplicationContext applicationContext) {
appContext = applicationContext;
}
}

View File

@@ -0,0 +1,39 @@
package top.fjy8018.designpattern.pattern.behavior.strategy.spring;
import lombok.Getter;
import lombok.Setter;
import java.util.Map;
/**
* 表单提交的请求
* FormSubmitHandler 的 getSubmitType 方法用来获取表单的提交类型(即策略类
* 型),用于根据客户端传递的参数直接获取到对应的策略实现;客户端传递的相关参数都被
* 封装为 FormSubmitRequest传递给 handleSubmit 进行处理。
*
* @author F嘉阳
* @date 2021-12-27 21:37
*/
@Getter
@Setter
public class FormSubmitRequest {
/**
* 提交类型
*
* @see FormSubmitHandler#getSubmitType()
*/
private String submitType;
/**
* 用户 id
*/
private Long userId;
/**
* 表单提交的值
*/
private Map<String, Object> formInput;
// 其他属性
}

View File

@@ -0,0 +1,20 @@
package top.fjy8018.designpattern.pattern.behavior.strategy.spring;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.Serializable;
@Component
class FormSubmitHandlerTest {
@Autowired
private FormSubmitHandlerFactory factory;
@Test
void getSubmitType() {
FormSubmitHandler<Serializable> handler = factory.getHandler("preview");
handler.handleSubmit(new FormSubmitRequest());
}
}