样例代码
涉及到的项目样例代码均可以从https://github.com/WeiXiao-Hyy/Design-Patterns.git获取
需求
实时地,根据city,sex,product字段进行业务投放,比如:北京的男生;四川的电脑等等 → 责任链模式(责任链表模式)
UML图
handler自身含有next指针和链表类似,使用Apollo进行动态配置字段进行规则变更
Apollo访问不到内网地址
由于Apollo使用Docker进行安装,导致Apollo访问不到configserver的地址
app:
id: DesignPatternLearning
# apollo
apollo:
meta: "http://localhost:8080"
bootstrap:
enabled: true
eagerLoad:
enabled: true
cacheDir:
"/Users/hujiale/GitCode/Apoll"
logger:
level:
com:
info
执行时在JVM参数添加-Dapollo.configService=http://localhost:8080
即可解决
核心代码
//组装责任链条并返回责任链条首节点
private AbstractBusinessHandler buildChain() {
//如果没有配置,直接返回null
if (Objects.isNull(this.handlerType)) {
return null;
}
if (Objects.isNull(this.currentHandlerType)) {
this.currentHandlerType = this.handlerType;
}
if (this.currentHandlerType.equals(this.handlerType) && Objects.nonNull(this.currentHandler)) {
return this.currentHandler;
} else {
log.info("config modified or first init, start to assemble duty chain.");
synchronized (this) {
try {
//伪头节点
AbstractBusinessHandler dummyHeadHandler = new CityHandler();
AbstractBusinessHandler preHandler = dummyHeadHandler;
//采用反射实例化责任链节点
String[] handlerTypeList = this.handlerType.split(",");
for (String handlerType : handlerTypeList) {
AbstractBusinessHandler handler = (AbstractBusinessHandler)
Class.forName(HandlerEnum.valueOf(handlerType).getValue()).newInstance();
preHandler.nextHandler = handler;
preHandler = handler;
}
// 初始化类中变量
this.currentHandler = dummyHeadHandler.nextHandler;
this.currentHandlerType = this.handlerType;
return this.currentHandler;
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
throw new UnsupportedOperationException(e);
}
}
}
}