应用场景
规格模式,英文名Specification Pattern
该模式将对产品特征的判断标准封装成规格类,专门用来判断产品是否合格
这种设计模式主要用于结果判断类的业务,比如我们做单元测试时,有个概念叫做断言,和这个就是一个性质
模式扩展
我们可以为规格类添加Bool运算功能,使不同的规格类之间可以进行与、或、非运算,从而组合出更复杂灵活的判断条件
代码实现
//产品类
public interface IProduct {
String getName();
}
//测试规则
public interface ISpec {
boolean test(Product product);
}
//复合规则,由多种规则组合而成
abstract public class CompositeSpec implements ISpec {
@Override
abstract public boolean test(Product product);
public CompositeSpec and(ISpec spec) {
return new AndSpec(this, spec);
}
public CompositeSpec or(ISpec spec) {
return new OrSpec(this, spec);
}
public CompositeSpec not() {
return new NotSpec(this);
}
}
//与运算
public class AndSpec extends CompositeSpec {
ISpec spec1;
ISpec spec2;
public AndSpec(ISpec spec1, ISpec spec2) {
this.spec1 = spec1;
this.spec2 = spec2;
}
@Override
public boolean test(IProduct product) {
return spec1.test(product) && spec2.test(product);
}
}
//非运算
public class NotSpec extends CompositeSpec {
ISpec spec;
public NotSpec(ISpec spec) {
this.spec = spec;
}
@Override
public boolean test(IProduct product) {
return !spec.test(product);
}
}
//或运算
public class OrSpec extends CompositeSpec {
ISpec spec1;
ISpec spec2;
public OrSpec(ISpec spec1, ISpec spec2) {
this.spec1 = spec1;
this.spec2 = spec2;
}
@Override
public boolean test(IProduct product) {
return spec1.test(product) || spec2.test(product);
}
}
//产品名称非空
public class NameIsNull extends CompositeSpec {
@Override
public boolean test(IProduct product) {
return product.getName() == null;
}
}
//产品名称符合指定规则
public class NameLike extends CompositeSpec {
String regex;
public NameLike(String regex) {
this.regex = regex;
}
@Override
public boolean test(IProduct product) {
return product.getName().matches(regex);
}
}
public class APP {
public static void main(String[] args) {
IProduct product = null;
CompositeSpec spec1 = new NameIsNull();
CompositeSpec spec2 = new NameLike(".*Product-A.*");
//名称为空,或名称符合指定规则
CompositeSpec spec = spec1.not().or(spec2);
boolean ok = spec.test(product);
System.out.println(ok);
}
}