这个问题是关于回调模式的具体用法。通过回调,我的意思是一个接口,我可以从我的应用程序中的较低层定义一个方法,该方法是(is)optionnaly(=默认设置为'什么都不做',感谢Java 8)。我的“应用程序”实际上是一个产品,它可能在客户端项目之间有很多变化,所以我需要分离一些东西,以便重用不会改变的东西(技术代码,技术集成)和其他东西(模型,规则) )。
我们举一个例子:
我开发了一个基于Apache CXF JAX-RS搜索的搜索服务。 此服务解析FIQL查询,该查询只能处理带有= /< /& gt / LIKE / ...条件的AND / OR条件以创建JPA条件查询。我不能使用像'isNull'这样的条件。
使用特定的接口我可以定义一个回调,当我从搜索服务中的apache CXF层获得条件查询时,将调用该回调,并在执行查询之前将我的条件添加到现有的条件。这个条件在我的searchService(RestController)的上层定义。这是为了减少代码重复,例如重新调整条件查询并在我需要的每个方法中完成它。并且因为在CXF中使用@Transactional JAX-RS控制器不能正常工作Spring代理和CXF工作(忽略一些JAX-RS注释);
第一个问题:这个例子在设计方面似乎是一个好主意吗?
另一个例子:我有一个对象,它有一些从服务层创建的基本字段。但我希望能够在实体持久化之前设置与服务进程无关的其他非可空字段。这些字段可能会从项目移动到另一个项目,所以我不想在每次添加/删除列时更改服务方法的签名。所以我再次考虑使用回调模式在同一事务中设置并且在服务层持久化对象之前。
第二个问题:这个例子怎么样?
全局问题:除了事件回调的经典用法之外:这是针对某些特定用途使用此模式的实践还是有更好的方法来处理它?</ p>
如果您需要一些代码示例问我,我会做一些(不能发布我当前的代码)。
答案 0 :(得分:1)
我不会说你所描述的是“接口的一个非常具体的用法,我可以从中定义可选地从较低层调用的方法”。我认为这是合理的,也是很常见的解决方案。
您的怀疑可能是由于命名。我宁愿在这里使用command pattern这个词。在我看来,它不那么令人困惑。您的方法也类似于strategy pattern,即您提供(注入)执行某些计算的对象。根据上下文,您可以注入以不同方式运行的对象(例如,向查询添加不同的条件)。
总结回调/命令不仅用于事件。我甚至会说事件是它们的具体用法。每当我们需要在一个对象中封装一个操作并以某种方式传递/传递它时,就会使用命令/回调模式(顺便说一句,在Java中没有其他方法可以这样做但是例如在C ++中有方法的指针,在C#中有代表......)。
关于你的第二个例子。我不确定我是否理解正确。为什么不能在调用服务之前简单地填充对象的所有必填字段?