您当前的位置: 首页 > 

命运之手

暂无认证

  • 3浏览

    0关注

    747博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

命运之手 发布时间:2022-05-04 15:02:44 ,浏览量:3

应用场景

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

关注
打赏
1654938663
查看更多评论
立即登录/注册

微信扫码登录

0.0374s