当前位置: 首页 > 后端技术 > Java

规范模式(SpecificationPattern)

时间:2023-04-02 09:31:17 Java

本文摘自《设计模式就该这样学》1 规范模式的定义规范模式(SpecificationPattern)可以认为是复合模式的扩展。很多时候,程序中的一些条件决定了业务逻辑,可以将这些条件抽取出来,按照一定的关系(AND、OR、NOT)进行组合,从而灵活定制业务逻辑。此外,在查询、过滤等应用中,可以通过预先定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句,从而简化整个实现逻辑。这里的每一个条件都是一个规范,多个规范(条件)串联起来形成具有一定逻辑关系的组合规范。规范模式是一种结构设计模式。2 规范模式应用场景规范模式主要适用于以下应用场景。(1)验证对象,检查对象本身是否满足一定的业务需求或是否准备好实现一定的业务目标。(2)从集合中选择满足特定业务规则的对象或对象子集。(3)指定创建新对象时必须满足一定的业务需求。3 SpecificationPattern的UML类图SpecificationPattern的UML类图如下图所示。从上图可以看出,规范模式主要包括6个角色。(1)抽象规范(Specification):规范的抽象定义。(2)复合规范(CompositeSpecification):一般设计为抽象类,对规范进行AND或NOT运算,实现and()、or()、not()方法,并在方法中关联子类,因为子类是固定类,所以可以关联父类。(3)与规范(AndSpecification):对规范进行AND运算,实现isSatisfiedBy()方法。(4)或规范(OrSpecification):对规范执行或操作,实现isSatisfiedBy()方法。(5)NotSpecification(NotSpecification):对规范进行非操作,实现isSatisfiedBy()方法。(6)业务规范(BizSpecification):实现isSatisfiedBy()方法判断业务,一个类就是一个判断方法,可以扩展。4 规范模式的常用写法下面是规范模式的一般写法。publicclassClient{publicstaticvoidmain(String[]args){//待分析的对象Listlist=newArrayList();//定义两个业务规范ISpecificationspec1=newBizSpecification("a");ISpecificationspec2=newBizSpecification("b");//Specificationcallfor(Objecto:list){if(spec1.and(spec2).isSatisfiedBy(o)){//如果o满足spec1&&spec2System.out.println(o);}}}//抽象规范书接口ISpecification{//候选是否满足条件booleanisSatisfiedBy(Objectcandidate);//和操作ISpecificationand(ISpecificationspec);//或操作ISpecification或(ISpecificationspec);//不操作ISpecificationnot();}//复合规范staticabstractclassCompositeSpecificationimplementsISpecification{//是否满足条件由子类实现publicabstractbooleanisSatisfiedBy(Objectcandidate);//和操作公共我Specificationand(ISpecificationspec){returnnewAndSpecification(this,spec);}//或操作publicISpecificationor(ISpecificationspec){returnnewOrSpecification(this,spec);}//不操作publicISpecificationnot(){returnnewNotSpecification(this);}}//andspecificationstaticclassAndSpecificationextendsCompositeSpecification{//传递两个specificationforandoperationprivateISpecificationleft;私有ISpecification权利;publicAndSpecification(ISpecificationleft,ISpecificationright){this.left=left;this.right=正确;}//执行和操作publicbooleanisSatisfiedBy(Objectcandidate){returnleft.isSatisfiedBy(candidate)&&right.isSatisfiedBy(candidate);}}staticclassOrSpecificationextendsCompositeSpecification{//传递两个或操作的规范privateISpecific离开了;私有ISpecification权利;publicOrSpecification(ISpecificationleft,ISpecificationright){this.left=left;this.right=正确;}//执行或操作publicbooleanisSatisfiedBy(Objectcandidate){returnleft.isSatisfiedBy(candidate)||right.isSatisfiedBy(候选人);}}staticclassNotSpecificationextendsCompositeSpecification{//传递非操作的两个规范privateISpecificationspec;publicNotSpecification(ISpecificationspec){this.spec=spec;}//不是操作publicbooleanisSatisfiedBy(Objectcandidate){return!spec.isSatisfiedBy(candidate);}}//业务规范staticclassBizSpecificationextendsCompositeSpecification{//基本对象,如name等,也可以是int等类型privateStringobj;publicBizSpecification(Stringobj){this.obj=obj;}//判断是否满足public要求booleanisSatisfiedBy(Objectcandidate){//根据引用对象判断是否返回true;}}}5 Specification模式优势Specification模式非常巧妙的实现了对象过滤功能,适用于多个对象之间的筛选和搜索,或者业务规则不适合放在任何已有的实体或值对象中,变化并且规则的组合会模糊对象类的基本含义,这种场景只存在于非常清晰不会改变的场景中,不可扩展,是固定不变的结构。一般来说,应该尽可能避免面向对象设计。关注微信公众号“汤姆炸弹架构”回复“设计模式”获取完整源码。【推荐】汤姆炸弹架构:30个设计模式实战案例(附源码),挑战60W年薪不是梦技术在于分享,我分享我的快乐!如果本文对您有帮助,请关注并点赞;有什么建议也可以留言或私信。您的支持是我坚持创作的动力。关注微信公众号“汤姆炸弹架构”,获取更多技术干货!

最新推荐
猜你喜欢