您的位置 首页 > 德语词汇

specification的 规格模式(Specification Pattern)

各位老铁们好,相信很多人对specification的都不是特别的了解,因此呢,今天就来为大家分享下关于specification的以及规格模式(Specification Pattern)的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

本文节选自《设计模式就该这样学》

规格模式(SpecificationPattern)可以认为是组合模式的一种扩展。很多时候程序中的某些条件决定了业务逻辑,这些条件就可以抽离出来以某种关系(与、或、非)进行组合,从而灵活地对业务逻辑进行定制。另外,在查询、过滤等应用场合中,通过预定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句来处理,可以简化整个实现逻辑。这里的每个条件都是一个规格,多个规格(条件)通过串联的方式以某种逻辑关系形成一个组合式的规格。规格模式属于结构型设计模式。

specification的 规格模式(Specification Pattern)

规格模式主要适用于以下应用场景。

(1)验证对象,检验对象本身是否满足某些业务要求或者是否已经为实现某个业务目标做好了准备。

(2)从集合中选择符合特定业务规则的对象或对象子集。

(3)指定在创建新对象的时候必须要满足某种业务要求。

由上图可以看到,规格模式主要包含6个角色。

(1)抽象规格书(Specification):对规格书的抽象定义。

(2)组合规格书(CompositeSpecification):一般设计为抽象类,对规格书进行与或非操作,实现and()、or()、not()方法,在方法中关联子类,因为子类为固定类,所以父类可以进行关联。

(3)与规格书(AndSpecification):对规格书进行与操作,实现isSatisfiedBy()方法。

(4)或规格书(OrSpecification):对规格书进行或操作,实现isSatisfiedBy()方法。

(5)非规格书(NotSpecification):对规格书进行非操作,实现isSatisfiedBy()方法。

(6)业务规格书(BizSpecification):实现isSatisfiedBy()方法,对业务进行判断,一个类为一种判断方式,可进行扩展。

\npublicclassClient{\n\npublicstaticvoidmain(String[]args){\n//待分析的对象\nList<Object>list=newArrayList<Object>();\n//定义两个业务规格书\nISpecificationspec1=newBizSpecification("a");\nISpecificationspec2=newBizSpecification("b");\n//规格调用\nfor(Objecto:list){\nif(spec1.and(spec2).isSatisfiedBy(o)){//如果o满足spec1&&spec2\nSystem.out.println(o);\n}\n}\n}\n\n//抽象规格书\ninterfaceISpecification{\n//候选者是否满足条件\nbooleanisSatisfiedBy(Objectcandidate);\n//and操作\nISpecificationand(ISpecificationspec);\n//or操作\nISpecificationor(ISpecificationspec);\n//not操作\nISpecificationnot();\n}\n\n//组合规格书\nstaticabstractclassCompositeSpecificationimplementsISpecification{\n//是否满足条件由子类实现\npublicabstractbooleanisSatisfiedBy(Objectcandidate);\n//and操作\npublicISpecificationand(ISpecificationspec){\nreturnnewAndSpecification(this,spec);\n}\n//or操作\npublicISpecificationor(ISpecificationspec){\nreturnnewOrSpecification(this,spec);\n}\n//not操作\npublicISpecificationnot(){\nreturnnewNotSpecification(this);\n}\n}\n\n//与规格书\nstaticclassAndSpecificationextendsCompositeSpecification{\n//传递两个规格书进行and操作\nprivateISpecificationleft;\nprivateISpecificationright;\n\npublicAndSpecification(ISpecificationleft,ISpecificationright){\nthis.left=left;\nthis.right=right;\n}\n\n//进行and运算\npublicbooleanisSatisfiedBy(Objectcandidate){\nreturnleft.isSatisfiedBy(candidate)&&right.isSatisfiedBy(candidate);\n}\n}\n\n\nstaticclassOrSpecificationextendsCompositeSpecification{\n//传递两个规格书进行or操作\nprivateISpecificationleft;\nprivateISpecificationright;\n\npublicOrSpecification(ISpecificationleft,ISpecificationright){\nthis.left=left;\nthis.right=right;\n}\n\n//进行or运算\npublicbooleanisSatisfiedBy(Objectcandidate){\nreturnleft.isSatisfiedBy(candidate)||right.isSatisfiedBy(candidate);\n}\n}\n\nstaticclassNotSpecificationextendsCompositeSpecification{\n//传递两个规格书进行非操作\nprivateISpecificationspec;\n\npublicNotSpecification(ISpecificationspec){\nthis.spec=spec;\n}\n\n//进行not运算\npublicbooleanisSatisfiedBy(Objectcandidate){\nreturn!spec.isSatisfiedBy(candidate);\n}\n}\n\n//业务规格书\nstaticclassBizSpecificationextendsCompositeSpecification{\n//基准对象,如姓名等,也可以是int等类型\nprivateStringobj;\npublicBizSpecification(Stringobj){\nthis.obj=obj;\n}\n//判断是否满足要求\npublicbooleanisSatisfiedBy(Objectcandidate){\n//根据基准对象判断是否符合\nreturntrue;\n}\n}\n}\n5规格模式的优点

规格模式非常巧妙地实现了对象筛选功能,适合在多个对象中筛选查找,或者业务规则不适于放在任何已有实体或值对象中,而且规则变化和组合会掩盖对象的基本含义的情况。

规格模式中有一个很严重的问题就是父类依赖子类,这种情景只有在非常明确不会发生变化的场景中存在,它不具备扩展性,是一种固化而不可变化的结构。一般在面向对象设计中应该尽量避免。

关注微信公众号『Tom弹架构』回复“设计模式”可获取完整源码。

【推荐】Tom弹架构:30个设计模式真实案例(附源码),挑战年薪60W不是梦

本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!

如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。私信回复"666"或关注微信公众号『Tom弹架构』可获取更多技术干货!

好了,文章到这里就结束啦,如果本次分享的specification的和规格模式(Specification Pattern)问题对您有所帮助,还望关注下本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023