构建用于正则表达式的抽象Java API - 编程入门网
据访问对象(Data Access Object,DAO)模式隐藏了如何访问数据库(或 LDAP 服务器、XML 文件等)的细节和复杂性,因为它提供了访问抽象持久存储 层的方法,而您则不需要在客户机代码中处理数据库问题(数据实际存储在哪里 )。这不是 四人组(Gang of Four,GoF)模式,而是 Sun 的 J2EE 最佳实践 的一部分。
在假想的开发团队示例中,他们正在寻找这样的层: 抽象所有正则表达式实现背后的概念。团队就可以着重学习和理解这些概念 。他们所学的可以应用到任何实现或版本。 支持新的库且没有副作用。基于插件体系结构,动态选择执行 regexp 模式 的实际库,并且适配器不会被耦合。新库仅会引入对新适配器的需要。 提供比较不同可选方案的方法。一个简单的基准实用程序就可以显示有趣的 性能测量结果。如果对每个实现都执行这样的实用程序,团队就会获得有价值的 信息并能选择最好的可选方案。 听起来不错,但…… 任何去耦方法都至少有一个缺点:如果客户机代码仅需要一个实现所提供的 特定功能,怎么办?您不能使用任何其它实现,因此您最终将代码与该实现耦合 。也许将来会在这方面有所改善,但您现在却束手无策。 这样的示例并不象您想的那样少。在 regexp 领域中,一些编译器选项仅被 某些实现支持。如果您的客户机代码需要这种特定的功能,那么这个一般层是不 够的 ― 至少从迄今对它描述来看是不够的。 附加层是否应支持每个实现的所有 非公共功能,并且如果选择了不支持该实 现的附加层则抛出异常?那可以是一种解决方案,但它并不支持仅定义 公共抽 象概念这一最初目标。 有一个 GoF 模式非常适合这种情形: 职责链(Chain of Responsibility) 。它在设计中引入了另一种间接方法。用这种方法,客户机代码向能处理其所发 消息的实体列表发送消息或命令。列表项被组织成链,因此消息可按顺序被处理 并且在到达链尾之前被用掉。 在这种情况中,可以通过特殊类型的消息对仅被某些实现支持的特定功能建 模。由链中的每一项根据其是否了解这些功能来决定是否将该消息传给下一项。 定义一个公共 API 这里讲述的 API 名为 RegexpPlugin 。已将它设计成遵循刚刚讨论的方法, 并且它在 regexp 库和使用该库的代码之间支持去耦。 RegexpPlugin 在以下示例中,我将总结一下使用具体实现(Jakarta Oro)和使用 RegexpPlugin API 之间的差别。 我从一个非常简单的 regexp 开始:假定您必须要解析的文本只是人名。您接收的格式是象 John A. Smith这样的内容,而您只想获取名字( John)。但您不知道单词由什么分隔,是空格、换行符、制表符还是这些字符的组合。能处理这样的输入格式的 regexp 只是 .*\s*(.*?)\s+.* 。我将一步一步地说明如何使用该 regexp 来抽取信息。 第一部分是点号和星号字符 .* ,它们在这里表示 任意数量的空格和 (.*?) 组之前的任何字符 。第二部分比较引人注意(因为它被圆括号括起来)。问号 表示 取第一个符合条件的项。 接下来的符号表示任意数量的空格、换行或制表符( \s ),但至少要有一个 ( + )。最后的点号和星号 .* 仅代表文本的余下部分(对它没有兴趣)。 因此,该 regexp 相当于: 取空格前的第一段文本。让我们来编写 Java 代 码。 构建用于正则表达式的抽象Java API(3)时间:2010-12-24 Jose San Leandro Arm上机实践 要在 Java 代码中使用正则表达式,通常需要完成以下七个步骤: 第 1 步:创建编译器实例。如果使用 Jakarta Oro,则必须实例化 Perl5Compiler :
使用 RegexpPlugin 时的等同代码是相似的:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |