1.定義基類接口:
public interface IModelParamStrategy extends InitializingBean {
void checkParam(HttpContextDto httpContextDto);
}
2.定義抽象類,實現策略接口
定義一個抽象類 AbstractModelParamStrategy,它實現了部分 IModelParamStrategy 接口的功能,并留出 checkParam方法需要被具體策略實現類實現
public abstract class AbstractModelParamStrategy implements IModelParamStrategy {
@Override
public abstract void checkParam(HttpContextDto httpContextDto);
}
3.具體的策略實現類
public class ChatParamStrategyV1 extends AbstractModelParamStrategy {
@Override
public void checkParam(HttpContextDto httpContextDto) {
}
@Override
public void afterPropertiesSet() throws Exception {
StrategyFactory.register("chat", this);
}
}
4.實現策略工廠類
public class StrategyFactory {
/**
* 存放特殊策略的工廠,使用名稱注冊
*/
private static Map<String, IModelParamStrategy> nameFactory = new ConcurrentHashMap<>(1);
public static void register(String name, IModelParamStrategy strategy) {
if (Objects.isNull(name) || Objects.isNull(strategy)) {
throw new RuntimeException("參數不能為空!");
}
if (nameFactory.containsKey(name)) {
throw new RuntimeException(String.format("%s類型已被注冊!", name));
}
nameFactory.put(name, strategy);
}
public static IModelParamStrategy get(String name) {
if (!nameFactory.containsKey(name)) {
throw new RuntimeException(name + "類型未支持!");
}
return nameFactory.get(name);
}
}
控制類:
IModelParamStrategy paramStrategy = StrategyFactory.get("chat");
paramStrategy.checkParam(httpContextDto);