栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【设计模式】【27】规格模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【设计模式】【27】规格模式

应用场景

规格模式,英文名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);
	    }
	}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/856906.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号