diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormDataHandlerFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormDataHandlerFactory.java new file mode 100644 index 0000000..442001c --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormDataHandlerFactory.java @@ -0,0 +1,23 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after; + +import org.springframework.stereotype.Component; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormDataHandler; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 14:14 + */ +@Component +public class FormDataHandlerFactory extends StrategyFactory { + /** + * 获取策略的类型(交给子类去实现) + * + * @return 策略的类型 + */ + @Override + protected Class getStrategyType() { + return FormDataHandler.class; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormItemConverterFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormItemConverterFactory.java new file mode 100644 index 0000000..007fdcb --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormItemConverterFactory.java @@ -0,0 +1,24 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after; + +import org.springframework.stereotype.Component; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemConverter; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemTypeEnum; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 14:17 + */ +@Component +public class FormItemConverterFactory extends StrategyFactory { + /** + * 获取策略的类型(交给子类去实现) + * + * @return 策略的类型 + */ + @Override + protected Class getStrategyType() { + return FormItemConverter.class; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/Strategy.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/Strategy.java new file mode 100644 index 0000000..8868598 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/Strategy.java @@ -0,0 +1,15 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 13:42 + */ +public interface Strategy { + + /** + * 获得策略的标识 + */ + T getId(); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java new file mode 100644 index 0000000..578044d --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java @@ -0,0 +1,60 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after; + +import com.google.common.collect.Maps; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +import java.util.Collection; +import java.util.Map; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 13:42 + */ +public abstract class StrategyFactory> implements InitializingBean, ApplicationContextAware { + + private Map strategyMap; + + private ApplicationContext appContext; + + /** + * 根据策略 id 获得对应的策略的 Bean + * + * @param id 策略 id + * @return 策略的 Bean + */ + public S getStrategy(T id) { + return strategyMap.get(id); + } + + /** + * 获取策略的类型(交给子类去实现) + * + * @return 策略的类型 + */ + protected abstract Class getStrategyType(); + + + @Override + public void afterPropertiesSet() throws Exception { + // 获取 Spring 容器中,所有 S 类型的 Bean + Collection strategies = appContext.getBeansOfType(getStrategyType()).values(); + + strategyMap = Maps.newHashMapWithExpectedSize(strategies.size()); + + // 将所有 S 类型的 Bean 放入到 strategyMap 中 + for (final S strategy : strategies) { + T id = strategy.getId(); + strategyMap.put(id, strategy); + } + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + appContext = applicationContext; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/CommonResponse.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/CommonResponse.java new file mode 100644 index 0000000..d80be8d --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/CommonResponse.java @@ -0,0 +1,10 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 14:16 + */ +public class CommonResponse { +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/FormDataHandler.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/FormDataHandler.java new file mode 100644 index 0000000..e36bd99 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/FormDataHandler.java @@ -0,0 +1,25 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean; + +import top.fjy8018.designpattern.pattern.behavior.strategy.spring.FormSubmitRequest; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after.Strategy; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 13:37 + */ +public interface FormDataHandler extends Strategy { + + /** + * 获得策略的标识 + */ + @Override + default String getId() { + return getFormCode(); + } + + String getFormCode(); + + CommonResponse submit(FormSubmitRequest request); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/FormItemConverter.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/FormItemConverter.java new file mode 100644 index 0000000..fdf7593 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/FormItemConverter.java @@ -0,0 +1,26 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean; + +import top.fjy8018.designpattern.pattern.behavior.templatemethod.spring.bean.FormItem; +import top.fjy8018.designpattern.pattern.behavior.templatemethod.spring.bean.FormItemConfig; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after.Strategy; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 13:40 + */ +public interface FormItemConverter extends Strategy { + + /** + * 获得策略的标识 + */ + @Override + default FormItemTypeEnum getId() { + return getType(); + } + + FormItemTypeEnum getType(); + + FormItem convert(FormItemConfig config); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/FormItemTypeEnum.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/FormItemTypeEnum.java new file mode 100644 index 0000000..bd4dbeb --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/bean/FormItemTypeEnum.java @@ -0,0 +1,10 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 13:39 + */ +public enum FormItemTypeEnum { +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/before/FormDataHandlerFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/before/FormDataHandlerFactory.java new file mode 100644 index 0000000..375f774 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/before/FormDataHandlerFactory.java @@ -0,0 +1,39 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.before; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormDataHandler; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 13:36 + */ +@Component +public class FormDataHandlerFactory { + + private static final + Map FORM_DATA_HANDLER_MAP = new HashMap<>(16); + + /** + * 根据表单标识,获取对应的 Handler + * + * @param formCode 表单标识 + * @return 表单对应的 Handler + */ + public FormDataHandler getHandler(String formCode) { + return FORM_DATA_HANDLER_MAP.get(formCode); + } + + @Autowired + public void setFormDataHandlers(List handlers) { + for (FormDataHandler handler : handlers) { + FORM_DATA_HANDLER_MAP.put(handler.getFormCode(), handler); + } + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/before/FormItemConverterFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/before/FormItemConverterFactory.java new file mode 100644 index 0000000..c9fa4e5 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/before/FormItemConverterFactory.java @@ -0,0 +1,39 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.before; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemConverter; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemTypeEnum; + +import java.util.EnumMap; +import java.util.List; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 13:38 + */ +@Component +public class FormItemConverterFactory { + + private static final + EnumMap CONVERTER_MAP = new EnumMap<>(FormItemTypeEnum.class); + + /** + * 根据表单项类型获得对应的转换器 + * + * @param type 表单项类型 + * @return 表单项转换器 + */ + public FormItemConverter getConverter(FormItemTypeEnum type) { + return CONVERTER_MAP.get(type); + } + + @Autowired + public void setConverters(List converters) { + for (final FormItemConverter converter : converters) { + CONVERTER_MAP.put(converter.getType(), converter); + } + } +} \ No newline at end of file