java - Java 中回调的非常具体的用法

标签 java design-patterns callback

这个问题是关于回调模式的具体用法。我所说的回调是指一个接口(interface),我可以从中定义从应用程序的较低层调用的可选方法(= 默认设置为“不执行任何操作”,感谢 Java 8)。我的“应用程序”实际上是一个产品,在客户端项目之间可能会有很多变化,所以我需要将一些东西分开,以便重用那些不会改变的东西(技术代码、技术集成)和其余部分(模型、规则) )。

让我们举个例子:

我开发了一个基于 Apache CXF JAX-RS 搜索的搜索服务。 此服务解析只能处理 AND/OR 条件和 =/

使用特定的接口(interface),我可以定义一个回调,当我从搜索服务中的 apache CXF 层获取条件查询时将调用该回调,并在执行查询之前将我的条件添加到现有条件中。这个条件是在我的searchService(RestController)的上层定义的。这是为了减少代码重复,例如重新调整条件查询并在我需要的每个方法中完成它。并且因为在CXF JAX-RS Controller 中使用@Transactional不能很好地工作Spring代理和CXF工作(一些JAX-RS注释被忽略);

第一个问题:这个例子在设计方面看起来是个好主意吗?

现在是另一个例子:我有一个对象,其中有一些从服务层创建的基本字段。但我希望能够在实体持久化之前设置与服务进程无关的其他不可为空字段。这些字段可能从一个项目移动到另一个项目,因此我不想每次添加/删除列时都更改服务方法的签名。因此,我再次考虑使用回调模式,以便能够在同一事务内以及在服务层保留对象之前进行设置。

第二个问题:这个例子怎么样?

全局问题:除了事件回调的经典用法:这是将此模式用于某些特定用途的做法还是有更好的方法来处理它?<​​/p>

如果您需要一些代码示例,请询问我,我会制作一些(无法发布我当前的代码)。

最佳答案

我不会说您所描述的是“一个接口(interface),我可以从中定义可以从较低层选择性调用的方法”的非常具体的用法>。我认为这是合理的,也是很常见的解决方案。

您的疑问可能是由于命名引起的。我宁愿使用术语command pattern这里。在我看来,这不那么令人困惑。您的方法也类似于 strategy pattern即您提供(注入(inject))一个执行某些计算的对象。根据上下文,您注入(inject)的对象的行为方式不同(例如,向查询添加不同的条件)。

总而言之,回调/命令不仅仅用于事件。我什至会说事件是它们的特定用法。每当我们需要将一个操作封装在一个对象中并以某种方式传输/传递它时,就会使用命令/回调模式(顺便说一句,在 Java 中没有其他方法可以做到这一点,但例如在 C++ 中有指向方法的指针,在 C# 中有指向方法的指针)有代表……)。

关于你的第二个例子。我不确定我理解是否正确。为什么不能在调用服务之前简单地填充对象的所有必需字段?

关于java - Java 中回调的非常具体的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35335849/

相关文章:

java - Hibernate Validator @URL 不接受没有 schema 的 URL

javascript - 如何调用一个函数,其名称在 Json 对象中传递?

java - 从 Weblogic for Spring Security 获取安全角色

java - 读取类的 jar 版本

php - 在 JS 处理程序或 PHP ajax 函数中为 ajax 函数生成 html 更好吗?

javascript - Angular : centralised resource factory with promises

node.js - 函数返回值在nodejs中未定义

c++ - C++中的回调函数

java - 如何将 JavaFX 导入 Eclipse?

python - 该数据使用什么数据结构?