知识卡片
策略模式消除条件判断:复杂性从算法迁移到对象关系
内容
收入确认的领域模型例子里,计算和创建过程从顾客开始,经产品类传递给一组策略类:每个产品实例都关联一个具体的确认策略实例,这个策略实例决定该用哪种算法计算收入确认额,不同产品类型对应不同的策略子类。策略模式的价值在于提供了良好封装的”插入点”——想新增一种收入确认算法,只需要新建一个策略子类、覆盖计算方法即可,不需要触碰任何既有代码。这种设计带来一个容易被忽视的效果:创建产品时把它和对应策略对象”挂钩”完成后,后续计算收入确认额的代码里完全不出现任何条件判断语句——通过把行为从一个对象连续传递给另一个最合适处理它的对象,条件分支被彻底消除了;产品创建时选中了哪个策略子类,就已经决定了后续的整条计算路径,这条”决策路径”是在对象关系建立的那一刻就确定下来的,而不是在运行时靠if/else层层判断出来的。这揭示了领域模型应对”一组相似条件判断逻辑”的通用打法:把这些相似的判断逻辑提炼进对象结构本身,让复杂性从算法内部转移到对象之间的关系网络里——原有逻辑越相似,转移后系统里能复用的这套关系网也就越多。
参考来源
- 位置:《企业应用架构模式》第二部分"模式"之"第9章 领域逻辑模式"之"9.2.4 例:收入确认(Java)"(源文件:_epub-src/OEBPS/Text/000067.html)
- 结论依据:原文说明"通过从一个对象到另一个对象的连续传递可以把行为传给最有资格处理的对象,它同时也消除了许多条件判断行为。你会注意到在前述计算中没有任何条件判断子句……当你的领域逻辑中有一组相似的条件判断语句时,领域模型可以很好地工作,因为相似的条件判断语句可以提取到对象结构本身之中。复杂性从算法迁移到了对象间的关系之中",直接支撑本卡结论。
- 原始内容:当你将对象像这样链接起来时,就确定了算法路径。当你的领域逻辑中有一组相似的条件判断语句时,领域模型可以很好地工作,因为相似的条件判断语句可以提取到对象结构本身之中。