设计模式是软件开发的时候,经常会用到的高频知识。是开发框架和业务代码必须知道和熟练使用的东西。
从一个例子开始
现在要设计一个选择器,前提是根据输入的请求的某个字段,路由到某段功能。
if(condition){功能1}
else if(condition){功能2}
else if(condition){功能3}
else{功能4}
这样是最简单的写法。
这时候,假设condition比较多,而且考虑到扩展性,并且对修改闭合的原则,需要对这个代码进行修改。
按照领域进行划分
按照内聚的设计原则,对不同域的内容进行划分。对conditoin进行设置的领域,可以叫做设置域或定义域。
实际执行condition的领域叫做运行域。
模板模式
在运行域,用模板模式进行改造:
selector.select();
execute();
工厂模式、策略模式
在定义域,用工厂模式和策略模式进行改造:
选择的规则,抽象成一个个策略。业务人员来实现这些策略。
同时生成策略的过程可以用工厂模式进行封装。
结果
这样,一个简单的选择过程,就可以使用设计模式设计成符合设计原则,有设计感的模块。
扩展:多结果
假设并不只是选择出一个结果,而是选择出多个结果,该如何设计?
把选择出结果这个过程同样抽象成一个策略,这个策略由业务人员提供。通过信息经过pipeline后,出来的是一个list。然后这个list再次通过策略,得到某一个或多个结果。
扩展:多维
如果是有二层或多层选择,该如何设计?
首要的关键是把选择逻辑和执行逻辑分离。所以多维的选择,应该是内聚的一个模块。
然后,参考多维坐标的概念,做一个根据一个多维数据确定一个数据点的功能,每个数据点对应一个业务实现的程序(execute方法)。这样就是一个通用的多维选择器。