项目子模块行为引起对设计模式的思考
目录
- 需求场景
- 问题
- 解决
- 思考
- 推荐公众号
需求场景
【项目子模块行为引起对设计模式的思考】在项目网关中,需要对子模块某些接口进行定制化需求,这很容易想到定义一个接口,子模块各自实现即可,一个策略模式搞定;而后添加了公共行为,向上抽象采用了模板方法,将公共部分提取到父类中,不同的点由子模型行为实现。
问题
interface Command{
String commandHandler();
}
//子模块1 实现
//子模块2实现
//......公共行为
1.获取当前登陆用户
2.各模块获取行为结果
3.。。。。。
4.。。。。。。
大致这思路,但是在公共行为中如何准确的获取子模型行为的实现类呢。
定义了一个CommandContext,维护一个map根据模块名匹配对象行为实现类,类似于Spring-IOC可以按照bean名称获取对应实例;
CommandContext在实例创建后完成COMMAND_MAP初始化,对外只暴露一个按KEY获取实例方法
Map, Command> COMMAND_MAP = new HashMap();
但是在后来添加一个子模块的时候,修改了CommandContext初始化方法,因为我是按照一个模块名对应一个实例put进去的,那么子模块需要实现Command接口还需要注册到COMMAND_MAP上而且子类想从其他行为实例获取结果时还需要改代码,这就不好了,万一子模块实现了但是没有注册到COMMAND_MAP上,而且这也违背了开闭原则
解决
在思考时,忽然想流程引擎怎么知道流转到哪个接口的?
答:流程图
对于上面的问题我们可以把KEY-实例的对应关系加在配置文件中嘛
BUS-KEY:模块1,模块2
COMMAND-BEAN:command模块1,command模块2
这样读配置,按照bean名称从spring上下文中获取
思考
经过上述的改变后,这还是书本上的设计模式吗?
答:不完全是,但是没有违背,代码健壮性,可扩展想,灵活性,复用性所以应当把设计模式当作经验,实际使用还需变通。
话说设计模式系列好久每更新了
推荐公众号
有彩蛋哦!!!(或者公众号内点击网赚获取彩蛋)
文章图片
推荐阅读
- 2018年11月19日|2018年11月19日 星期一 亲子日记第144篇
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 这辈子我们都不要再联系了
- 2019年12月24日
- Ⅴ爱阅读,亲子互动——打卡第178天
- 眼观耳听美食的日子
- 子龙老师语录
- 成交的种子咖啡冥想
- 2018年9月5日,星期三,天气晴
- 生活随笔|好天气下的意外之喜