打字猴:1.70048422e+09
1700484220 for(User u:userProvider.findUser(spec.and(spec2))){
1700484221
1700484222 System.out.println(u);
1700484223
1700484224 }
1700484225
1700484226 }
1700484227
1700484228 }
1700484229
1700484230 在场景类中我们建立了两个规格书,一个是年龄大于25的用户,一个是名字中包含“国庆”两个字的用户,这两个规格书之间的关系是“与”关系,运行结果如下:
1700484231
1700484232 ===名字包含国庆的人员===
1700484233
1700484234 用户名:国庆牛 年龄:82
1700484235
1700484236 到此为止我们的LINQ已经完成了很大一部分了,SQL语句中的where后面部分已经可以解析了,完全可以再增加年龄相等的规格书、姓名字数规格书等等,你在SQL中使用过的条件在这里都能实现了。功臣还是依赖于三个与或非规格书,有了它们三个栋梁才能组合出一个精彩的条件查询世界。
1700484237
1700484238
1700484239
1700484240
1700484241 设计模式之禅 [:1700454090]
1700484242 设计模式之禅 37.2 最佳实践
1700484243
1700484244 我们在例子中多次提到规格两个字,该实现模式就叫做规格模式(Specification Pattern),它不属于23个设计模式,它是其中一个模式的扩展,是哪个模式呢?
1700484245
1700484246 我们用全局的观点思考一下,基类代表的是所有的规格书,它的目的是描述一个完整的、可组合的规格书,它代表的是一个整体,其下的And规格书、Or规格书、Not规格书、年龄大于基准年龄规格书等等都是一个真实的实现,也就是一个局部,现在我们又回到了整体和部分的关系了,那这是什么模式?对,组合模式,它是组合模式的一种特殊应用,我们来看它的通用类图,如图37-5所示。
1700484247
1700484248
1700484249
1700484250
1700484251 图37-5 规格模式通用类图
1700484252
1700484253 为什么在通用类图中把方法名称都定义出来呢?是因为只要使用规格模式,方法名称都是这四个,它是把组合模式更加具体化了,放在一个更狭小的应用空间中。我们再仔细看看,还能不能找到其他模式的身影?对,策略模式,每个规格书都是一个策略,它完成了一系列逻辑的封装,用年龄相等的规格书替换年龄大于指定年龄的规格书上层逻辑有什么改变吗?不需要任何改变!
1700484254
1700484255 规格模式非常重要,它巧妙地实现了对象筛选功能。我们来看其通用源码,首先看抽象规格书,如代码清单37-22所示。
1700484256
1700484257 代码清单37-22 抽象规格书
1700484258
1700484259 public interface ISpecification{
1700484260
1700484261 //候选者是否满足要求
1700484262
1700484263 public boolean isSatisfiedBy(Object candidate);
1700484264
1700484265 //and操作
1700484266
1700484267 public ISpecification and(ISpecification spec);
1700484268
1700484269 //or操作
[ 上一页 ]  [ :1.70048422e+09 ]  [ 下一页 ]