当前位置: 首页 > 科技观察

设计模式规范模式(SpecificationPattern)

时间:2023-03-23 11:52:39 科技观察

1规范模式的定义规范模式(SpecificationPattern)可以认为是组合模式的扩展。很多时候,程序中的一些条件决定了业务逻辑,可以将这些条件抽取出来,按照一定的关系(AND、OR、NOT)进行组合,从而灵活定制业务逻辑。此外,在查询、过滤等应用中,可以通过预先定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句,从而简化整个实现逻辑。这里的每一个条件都是一个规范,多个规范(条件)串联起来形成具有一定逻辑关系的组合规范。规范模式是一种结构设计模式。2规范模式应用场景规范模式主要适用于以下应用场景。(1)验证对象,检查对象本身是否满足一定的业务需求或是否准备好实现一定的业务目标。(2)从集合中选择满足特定业务规则的对象或对象子集。(3)指定创建新对象时必须满足一定的业务需求。3规范模式的UML类图规范模式的UML类图如下图所示。从上图可以看出,规范模式主要包括6个角色。(1)抽象规范(Specification):规范的抽象定义。(2)复合规范(CompositeSpecification):一般设计为抽象类,对规范进行AND或NOT运算,实现and()、or()、not()方法,并在方法中关联子类,因为子类是固定类,所以可以关联父类。(3)与规范(AndSpecification):对规范进行AND运算,实现isSatisfiedBy()方法。(4)或规范(OrSpecification):对规范执行或操作,实现isSatisfiedBy()方法。(5)非规范(NotSpecification):对规范进行非操作,实现isSatisfiedBy()方法。(6)业务规范(BizSpecification):实现isSatisfiedBy()方法判断业务,一个类就是一个判断方法,可以扩展。4规范模式的一般写法下面是规范模式的一般写法。publicclassClient{publicstaticvoidmain(String[]args){//待分析对象Listlist=newArrayList();//定义两个业务规范ISpecificationspec1=newBizSpecification("a");ISpecificationspec2=newBizSpecification("b");//speccallfor(Objecto:list){if(spec1.and(spec2).isSatisfiedBy(o)){//ifo满足spec1&&spec2System.out.println(o);}}}//抽象规范interfaceISpecification{//候选满足条件booleanisSatisfiedBy(Objectcandidate);//和操作ISpecificationand(ISpecificationspec);//或操作ISpecificationor(ISpecificationspec);//不操作ISpecificationnot();}//复合规范staticabstractclassCompositeSpecificationimplementsISpecification{//是否条件满足由子类实现publicabstractbooleanisSatisfiedBy(Objectcandidate);//和操作publicISpecificationand(ISpecificationspec){returnnewAndSpecification(this,spec);}//或操作publicISpecificationor(ISpecificationspec){returnnewOrSpecification(this,spec);}//不运行publicISpecificationnot(){returnnewNotSpecification(this);}}//带规范staticclassAndSpecificationextendsCompositeSpecification{//传递两个规范进行AND运算privateISpecificationleft;privateISpecificationright;publicAndSpecification(ISpecificationleft,ISpecificationright){this.left=left;this.right=right;}//进行AND运算publicbooleanisSatisfiedBy(Objectcandidate){returnleft.isSatisfiedBycandidate)&&right.isSatisfiedBy(candidate);}}staticclassOrSpecificationextendsCompositeSpecification{//传递或操作的两个规范privateISpecificationleft;privateISpecificationright;publicOrSpecification(ISpecificationleft,ISpecificationright){this.left=left;this.right=right;}//执行或操作publicbooleanisSatisfiedBy(Objectcandidate){returnleft.isSatisfiedBy(candidate)||right.isSatisfiedBy(candidate);}}staticclassNotSpecificationextendsCompositeSpecification{//为非操作传递两个规范privateISpecificationspec;publicNotSpecification(ISpecification=specification)}{this.//执行不操作publicbooleanisSatisfiedBy(Objectcandidate){return!spec.isSatisfiedBy(candidate);}}//业务规范staticclassBizSpecificationextendsCompositeSpecification{//基准对象,比如name,也可以是int等类型privateStringobj;publicBizSpecification(Stringobj){this.obj=obj;}//判断是否满足要求publicbooleanisSatisfiedBy(Objectcandidate){//判断是否满足基准对象returntrue;}}}5规范模式的优点规范模式实现对象过滤功能非常巧妙,适合在多个对象中进行过滤和查找,或者业务规则不适合放在任何已有的实体或值对象中,规则的变化和组合会模糊对象的基本含义6规范模式的缺点规范模式存在一个严重的问题,即父类依赖于子类。这种情况只存在于非常明确不会改变的场景中,它没有扩展性,是固定不变的结构。一般来说,应该尽可能避免面向对象设计。

最新推荐
猜你喜欢