spring增强抽象工厂
This commit is contained in:
@@ -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<String, FormDataHandler> {
|
||||
/**
|
||||
* 获取策略的类型(交给子类去实现)
|
||||
*
|
||||
* @return 策略的类型
|
||||
*/
|
||||
@Override
|
||||
protected Class<FormDataHandler> getStrategyType() {
|
||||
return FormDataHandler.class;
|
||||
}
|
||||
}
|
||||
@@ -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<FormItemTypeEnum, FormItemConverter> {
|
||||
/**
|
||||
* 获取策略的类型(交给子类去实现)
|
||||
*
|
||||
* @return 策略的类型
|
||||
*/
|
||||
@Override
|
||||
protected Class<FormItemConverter> getStrategyType() {
|
||||
return FormItemConverter.class;
|
||||
}
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
/**
|
||||
* 获得策略的标识
|
||||
*/
|
||||
T getId();
|
||||
}
|
||||
@@ -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<T, S extends Strategy<T>> implements InitializingBean, ApplicationContextAware {
|
||||
|
||||
private Map<T, S> strategyMap;
|
||||
|
||||
private ApplicationContext appContext;
|
||||
|
||||
/**
|
||||
* 根据策略 id 获得对应的策略的 Bean
|
||||
*
|
||||
* @param id 策略 id
|
||||
* @return 策略的 Bean
|
||||
*/
|
||||
public S getStrategy(T id) {
|
||||
return strategyMap.get(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取策略的类型(交给子类去实现)
|
||||
*
|
||||
* @return 策略的类型
|
||||
*/
|
||||
protected abstract Class<S> getStrategyType();
|
||||
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
// 获取 Spring 容器中,所有 S 类型的 Bean
|
||||
Collection<S> 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;
|
||||
}
|
||||
}
|
||||
@@ -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<T> {
|
||||
}
|
||||
@@ -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<String> {
|
||||
|
||||
/**
|
||||
* 获得策略的标识
|
||||
*/
|
||||
@Override
|
||||
default String getId() {
|
||||
return getFormCode();
|
||||
}
|
||||
|
||||
String getFormCode();
|
||||
|
||||
CommonResponse<Object> submit(FormSubmitRequest request);
|
||||
}
|
||||
@@ -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<FormItemTypeEnum> {
|
||||
|
||||
/**
|
||||
* 获得策略的标识
|
||||
*/
|
||||
@Override
|
||||
default FormItemTypeEnum getId() {
|
||||
return getType();
|
||||
}
|
||||
|
||||
FormItemTypeEnum getType();
|
||||
|
||||
FormItem convert(FormItemConfig config);
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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<String, FormDataHandler> 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<FormDataHandler> handlers) {
|
||||
for (FormDataHandler handler : handlers) {
|
||||
FORM_DATA_HANDLER_MAP.put(handler.getFormCode(), handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<FormItemTypeEnum, FormItemConverter> CONVERTER_MAP = new EnumMap<>(FormItemTypeEnum.class);
|
||||
|
||||
/**
|
||||
* 根据表单项类型获得对应的转换器
|
||||
*
|
||||
* @param type 表单项类型
|
||||
* @return 表单项转换器
|
||||
*/
|
||||
public FormItemConverter getConverter(FormItemTypeEnum type) {
|
||||
return CONVERTER_MAP.get(type);
|
||||
}
|
||||
|
||||
@Autowired
|
||||
public void setConverters(List<FormItemConverter> converters) {
|
||||
for (final FormItemConverter converter : converters) {
|
||||
CONVERTER_MAP.put(converter.getType(), converter);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user