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操作
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
[
上一页 ]
[ :1.700484241e+09 ]
[
下一页 ]