知识卡片
规格模式用与或非组合规格书并容许父类依赖子类的例外
内容
[[规格模式用规格对象封装查询条件避免接口无限膨胀]]仅支持单一条件,若表达 “姓名含X且年龄大于Y”复合条件,连续过滤会多次全量遍历且组合数量爆炸。解法是让 and/or/not本身也返回规格对象:CompositeSpecification在方法里new出AndSpecification 等子类。发散:父类依赖具体子类看似违反面向接口编程,但与或非是逻辑运算的封闭集合、 明确不会再增加,属刻意例外,可固化。
参考来源
- 位置:《设计模式之禅(第2版)》第38章《新模式》38.1.1节(源文件:_epub-src/text/part0161.html)
- 结论依据:原文说明用两次过滤实现复合查询"效率太低……组合方式非常多……产生组合爆炸",进而设计`CompositeSpecification`直接`new`具体子类返回复合规格,并指出"父类依赖子类的情景只有在非常明确不会发生变化的场景中存在,它不具备扩展性,是一种固化而不可变化的结构……与或非操作符号还会增加修改吗?规格书对象之间的操作还有其他吗?思考清楚这些问题后,答案就迎刃而解了"。
- 原始内容:能够实现,但是思考一下程序逻辑,它采用了两次过滤……如果对象数量巨大,这个效率就太低了……太多的组合方式,产生组合爆炸,这种设计就不妥了……父类依赖子类的情景只有在非常明确不会发生变化的场景中存在,它不具备扩展性,是一种固化而不可变化的结构。