Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据多种模式验证字符串的最佳方法_Java_Design Patterns_Strategy Pattern - Fatal编程技术网

Java 根据多种模式验证字符串的最佳方法

Java 根据多种模式验证字符串的最佳方法,java,design-patterns,strategy-pattern,Java,Design Patterns,Strategy Pattern,这是一个关于最佳实践/设计模式而不是regexp的问题 简而言之,我有3个值:from、to和我要更改的值。From必须匹配以下几种模式之一: XX.X >XX.X >=XX.X <XX.X <=XX.X XX.X-XX.X XX.X >二十、 X >=XX.X ValueMatcher接口和5个实现,每个实现只有1个简短的“匹配”方法。我认为这肯定比国际单项体育联合会更好,但看起来仍然是一个夸张的解决方案 对于一些简单的事情,比如用一个运算符和一个极限值来计算一个数字

这是一个关于最佳实践/设计模式而不是regexp的问题

简而言之,我有3个值:from、to和我要更改的值。From必须匹配以下几种模式之一:

XX.X
>XX.X
>=XX.X
<XX.X
<=XX.X
XX.X-XX.X
XX.X
>二十、 X
>=XX.X
ValueMatcher接口和5个实现,每个实现只有1个简短的“匹配”方法。我认为这肯定比国际单项体育联合会更好,但看起来仍然是一个夸张的解决方案

对于一些简单的事情,比如用一个运算符和一个极限值来计算一个数字,你能不能再编写一个通用的ValueMatcher,它的参数是一个极限值和一个运算符?然后,添加5个ValueMatcher实例以及>、>=等的一些组合将非常容易


编辑:删除了非Java内容。。。很抱歉。

责任链如何

每个ValueMatcher对象正好有一个From/To规则和对链中下一个ValueMatcher的引用。每个ValueMatcher都有一个方法来检查候选对象,然后将其转换或传递给链中的下一个


这种添加新规则的方式是一种简单的扩展,控制代码只会将候选规则传递给链的第一个成员。

我希望我可以这样做-不幸的是,Java没有提供委托。让类似的东西工作的唯一方法可能是使用反射,我真的不想这样做。我想我可以,但我首先必须检查输入了哪个选项,并根据它得到相应的运算符和值(一些选项只有1个值,一些选项有2个值)。我真的不明白如果没有ifs我怎么能做到。嗯,但它不是和我代码中的5个ifs一样吗?我的意思是,首先我必须使用第一个ValueMatcher,检查From值是否匹配这将是第一个if,然后我必须转到下一个Matcher,等等。每个Matcher将表示1 if。我猜我的解决方案也是一堆“If”,但作为HashMap“隐藏”。会有相同数量的If,但它们以非常规则的方式出现,每个ValueMatcher都会说“If(对我来说)”别这么做,把它传下去。你不会得到一堆越来越多的if语句。因为你的规则不是完全规则的,我看不出有任何其他方法可以替代特定的if,我们只需要以一种干净的方式来构造它们。我自己也遇到过类似的情况,并使用HashMap。我真希望Java能够支持第一类函数。