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操作
1700484270
1700484271
public ISpecification or(ISpecification spec);
1700484272
1700484273
//not操作
1700484274
1700484275
public ISpecification not();
1700484276
1700484277
}
1700484278
1700484279
组合规格书实现与或非的算法,如代码清单37-23所示。
1700484280
1700484281
代码清单37-23 组合规格书
1700484282
1700484283
public abstract class CompositeSpecification implements ISpecification{
1700484284
1700484285
//是否满足条件由实现类实现
1700484286
1700484287
public abstract boolean isSatisfiedBy(Object candidate);
1700484288
1700484289
//and操作
1700484290
1700484291
public ISpecification and(ISpecification spec){
1700484292
1700484293
return new AndSpecification(this,spec);
1700484294
1700484295
}
1700484296
1700484297
//not操作
1700484298
1700484299
public ISpecification not(){
[
上一页 ]
[ :1.70048425e+09 ]
[
下一页 ]