Spring策略模式
This commit is contained in:
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
.idea
|
||||
.classpath
|
||||
.project
|
||||
*.iml
|
||||
target/
|
||||
.DS_Store
|
||||
.gitattributes
|
||||
log/
|
||||
2
.idea/Design-pattern.iml
generated
2
.idea/Design-pattern.iml
generated
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4" />
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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 只负责获取 Handler,Handler 只负责处理具体的提交,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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
// 其他属性
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user