针对许多模式验证字符串的最佳方法

时间:2011-08-23 14:09:06

标签: java design-patterns strategy-pattern

这是一个关于最佳实践/设计模式的问题,而不是正则表达式。

简而言之,我有3个值:from,to和我想要改变的值。从必须匹配几种模式之一:

XX.X
>XX.X
>=XX.X
<XX.X
<=XX.X
XX.X-XX.X

而To必须是十进制数。根据From中给出的值,我必须检查我想要更改的值是否满足From条件。例如,用户输入“From:&gt; 100.00 To:150.00”表示应更改大于100.00的每个值。

正则表达式本身不是问题。问题是,如果我匹配整个From与一个正则表达式并且它通过我仍然需要检查输入了哪个选项 - 这将在我的代码中生成至少5个IF,并且每次我想要添加另一个选项时我将需要添加另一个如果 - 不酷。如果我要创建5个模式也是一样。

现在我有一个HashMap,它将一个模式作为键,一个ValueMatcher作为值。当用户输入From值然后我在循环中将其与该映射中的每个键匹配,如果匹配则我使用相应的ValueMatcher来实际检查我想要更改的值是否满足“From”值。

另一方面,这个方法要求我拥有一个具有所有可能性的HashMap,一个ValueMatcher接口和5个实现,每个实现只有1个短“匹配”方法。我认为它肯定比IF好,但看起来仍然是一个夸张的解决方案。

还有其他办法吗?或者这是我应该如何做到的?我真的很遗憾我们不能在HashMap中保存方法/将它们作为参数传递,因为那时我只有一个包含所有匹配方法的类并将它们存储在HashMap中。

2 个答案:

答案 0 :(得分:2)

责任链怎么样。

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

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

答案 1 :(得分:0)

  

一个ValueMatcher接口和5个实现,每个只有1个短&#34;匹配&#34;梅索德。我认为它肯定比IF好,但看起来仍然是一个夸张的解决方案。

那么,对于像操作员和极限值评估数字那样简单的事情,你不能只写一个稍微更通用的ValueMatcher,它有一个极限值和一个运算符作为参数吗?然后,使用&gt;,&gt; =等的几个组合添加此ValueMatcher的5个实例非常容易。

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