项目子模块行为引起对设计模式的思考


目录

      • 需求场景
      • 问题
      • 解决
      • 思考
      • 推荐公众号

需求场景
【项目子模块行为引起对设计模式的思考】在项目网关中,需要对子模块某些接口进行定制化需求,这很容易想到定义一个接口,子模块各自实现即可,一个策略模式搞定;而后添加了公共行为,向上抽象采用了模板方法,将公共部分提取到父类中,不同的点由子模型行为实现。
问题
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上下文中获取

思考
经过上述的改变后,这还是书本上的设计模式吗? 答:不完全是,但是没有违背,代码健壮性,可扩展想,灵活性,复用性所以应当把设计模式当作经验,实际使用还需变通。 话说设计模式系列好久每更新了

推荐公众号
有彩蛋哦!!!(或者公众号内点击网赚获取彩蛋)
项目子模块行为引起对设计模式的思考
文章图片

    推荐阅读