知识卡片

规格模式用规格对象封装查询条件避免接口无限膨胀

普通读书笔记卡 · 1997

内容

在内存对象集合里实现类似SQL where查询,直接给接口加方法会导致接口随条件种类 膨胀。规格模式解法:把筛选条件封装成独立对象,定义isSatisfiedBy接口,每种条件各实现 一个具体规格类;查询接口只需findUser(规格对象)一个方法,内部调用isSatisfiedBy逐一 过滤。发散:新增条件只需新增规格类,接口永远不用改——这是把变化点从接口签名拿出、 封装进独立策略对象的典型手法。

参考来源

- 位置:《设计模式之禅(第2版)》第38章《新模式》38.1.1节(源文件:_epub-src/text/part0161.html) - 结论依据:原文指出"业务变化虽然无规则,但是可以预测……IUserProvider接口是不是要一直修改下去?……在这里接口竟然都可以修改,是不是发现设计有很大问题了……既然不能在封装外运算,那就把整个条件都进行封装,由IUserProvider自己实现运算……我们叫它规格类……我们持续地扩展规格书,有多少查询分类就可以扩展出多少个实现类,而IUserProvider则不需要任何改动"。 - 原始内容:业务变化虽然无规则,但是可以预测,比如我们这个查询,今天要查找年龄大于20岁的用户,明天要查找年龄小于30岁的用户……IUserProvider接口是不是要一直修改下去?……我们持续地扩展规格书,有多少查询分类就可以扩展出多少个实现类,而IUserProvider则不需要任何改动,它的一个方法就覆盖了我们刚刚提出的N多查询路径。