From e20286c47df6f45af7c3333f9bd42cafc22f3f36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Mon, 27 Dec 2021 21:55:03 +0800 Subject: [PATCH] =?UTF-8?q?Spring=E7=AD=96=E7=95=A5=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 +++ .idea/Design-pattern.iml | 2 - .../strategy/spring/CommonPairResponse.java | 12 ++++ .../strategy/spring/FormHsfSubmitHandler.java | 45 +++++++++++++++ .../spring/FormModelSubmitHandler.java | 43 ++++++++++++++ .../spring/FormPreviewSubmitHandler.java | 39 +++++++++++++ .../strategy/spring/FormSubmitHandler.java | 26 +++++++++ .../spring/FormSubmitHandlerFactory.java | 57 +++++++++++++++++++ .../strategy/spring/FormSubmitRequest.java | 39 +++++++++++++ .../spring/FormSubmitHandlerTest.java | 20 +++++++ 10 files changed, 289 insertions(+), 2 deletions(-) create mode 100644 .gitignore delete mode 100644 .idea/Design-pattern.iml create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/CommonPairResponse.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormHsfSubmitHandler.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormModelSubmitHandler.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormPreviewSubmitHandler.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandler.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandlerFactory.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitRequest.java create mode 100644 src/test/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandlerTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57f7c69 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.idea +.classpath +.project +*.iml +target/ +.DS_Store +.gitattributes +log/ diff --git a/.idea/Design-pattern.iml b/.idea/Design-pattern.iml deleted file mode 100644 index 78b2cc5..0000000 --- a/.idea/Design-pattern.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/CommonPairResponse.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/CommonPairResponse.java new file mode 100644 index 0000000..7a8ca50 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/CommonPairResponse.java @@ -0,0 +1,12 @@ +package top.fjy8018.designpattern.pattern.behavior.strategy.spring; + +/** + * @author F嘉阳 + * @date 2021-12-27 21:37 + */ +public class CommonPairResponse { + + public static CommonPairResponse success(String s, Object o) { + return null; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormHsfSubmitHandler.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormHsfSubmitHandler.java new file mode 100644 index 0000000..e08f441 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormHsfSubmitHandler.java @@ -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 { + /** + * 获得提交类型(返回值也可以使用已经存在的枚举类) + * + * @return 提交类型 + */ + @Override + public String getSubmitType() { + return "hsf"; + } + + /** + * 处理表单提交请求 + * + * @param request 请求 + * @return 响应,left 为返回给前端的提示信息,right 为业务值 + */ + @Override + public CommonPairResponse handleSubmit(FormSubmitRequest request) { + log.info("HSF 模式提交:userId={}, formInput={}", request.getUserId(), request.getFormInput()); + // 进行 HSF 泛化调用,获得业务方返回的提示信息和业务数据 + CommonPairResponse response = hsfSubmitData(request); + + return response; + } + + private CommonPairResponse hsfSubmitData(FormSubmitRequest request) { + return null; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormModelSubmitHandler.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormModelSubmitHandler.java new file mode 100644 index 0000000..ae13ed5 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormModelSubmitHandler.java @@ -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 { + /** + * 获得提交类型(返回值也可以使用已经存在的枚举类) + * + * @return 提交类型 + */ + @Override + public String getSubmitType() { + return "model"; + } + + /** + * 处理表单提交请求 + * + * @param request 请求 + * @return 响应,left 为返回给前端的提示信息,right 为业务值 + */ + @Override + public CommonPairResponse 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; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormPreviewSubmitHandler.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormPreviewSubmitHandler.java new file mode 100644 index 0000000..2efc6d9 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormPreviewSubmitHandler.java @@ -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 { + /** + * 获得提交类型(返回值也可以使用已经存在的枚举类) + * + * @return 提交类型 + */ + @Override + public String getSubmitType() { + return "preview"; + } + + /** + * 处理表单提交请求 + * + * @param request 请求 + * @return 响应,left 为返回给前端的提示信息,right 为业务值 + */ + @Override + public CommonPairResponse handleSubmit(FormSubmitRequest request) { + log.info("预览模式提交:userId={}, formInput={}", request.getUserId(), request.getFormInput()); + + return CommonPairResponse.success("预览模式提交数据成功!", null); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandler.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandler.java new file mode 100644 index 0000000..df3d490 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandler.java @@ -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 { + /** + * 获得提交类型(返回值也可以使用已经存在的枚举类) + * + * @return 提交类型 + */ + String getSubmitType(); + + /** + * 处理表单提交请求 + * + * @param request 请求 + * @return 响应,left 为返回给前端的提示信息,right 为业务值 + */ + CommonPairResponse handleSubmit(FormSubmitRequest request); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandlerFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandlerFactory.java new file mode 100644 index 0000000..d287d2b --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandlerFactory.java @@ -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 + * 来获取对应的表单提交处理器 + *

+ * Factory 只负责获取 Handler,Handler 只负责处理具体的提交,Service 只负责逻辑编排, + * 从而达到功能上的 “低耦合高内聚”。 + * + * @author F嘉阳 + * @date 2021-12-27 21:44 + */ +@Component +public class FormSubmitHandlerFactory implements InitializingBean, ApplicationContextAware { + + private static final Map> FORM_SUBMIT_HANDLER_MAP = new HashMap<>(8); + + private ApplicationContext appContext; + + /** + * 根据提交类型获取对应的处理器 + * + * @param submitType 提交类型 + * @return 提交类型对应的处理器 + */ + public FormSubmitHandler 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; + } + +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitRequest.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitRequest.java new file mode 100644 index 0000000..d4c069f --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitRequest.java @@ -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 formInput; + + // 其他属性 +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandlerTest.java b/src/test/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandlerTest.java new file mode 100644 index 0000000..337ed21 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/behavior/strategy/spring/FormSubmitHandlerTest.java @@ -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 handler = factory.getHandler("preview"); + handler.handleSubmit(new FormSubmitRequest()); + } +} \ No newline at end of file