gpt4 book ai didi

design-patterns - 回调/命令与EventListener/观察者模式

转载 作者:行者123 更新时间:2023-12-03 09:04:19 25 4
gpt4 key购买 nike

我正在尝试设计一个异步框架,想知道人们认为回调模式与观察者模式的优缺点。

Callback pattern:

//example callback
public interface Callback{
public void notify(MethodResult result);
}

//example method
public class Worker{
public void doAsyncWork(Callback callback){
//do work
callback.notify(result);
}
}

//example observer pattern
public interface EventListener{
public void notify(MethodResult result);

}

public class Worker{
private EventListener listener;
public registerEventListener(EventListener listener){
this.listener=listener;
}
public void doAsyncWork(){
//do work
listener.notify(result);
}
}

我正在使用似乎同时使用这两种模式的框架。 EventListener模式不是典型的模式,因为它没有侦听器列表。尽管可以通过创建CompositeListener来轻松实现此目的,该CompositeListener在侦听器的优先级上具有自己的语义,以及如何处理向每个侦听器的事件分配,例如为每个侦听器和串行通知生成一个新线程。 (我实际上认为这是一个好主意,因为它很好地分离了关注点,并且是对标准观察者/侦听器模式的改进)。

关于何时应使用它们的任何想法?

谢谢

最佳答案

两种模式都很不错,选择哪种模式取决于您要构建什么以及如何使用框架。

如果您要通过以下典型工作流程来构建某种发布-订阅系统:

  • 客户端启动异步任务,并且忘记了它
  • 多个处理程序在任务完成时接收通知

  • 那么 Observer模式对您来说是自然的选择。在做框架时,还应考虑使用 EventBus模式来实现松散耦合。

    如果您只需要简单的异步执行,而使用框架的典型流程是:
  • 启动异步任务
  • 完成后做些事情

  • 要么
  • 启动异步任务
  • 做某事
  • 等到完成后再做些

  • 那么您应该使用简单的 Callback

    但是为了获得更加实用和干净的API,我建议您摆脱 Callback抽象,设计您的工作代码以返回某种 Future
    public interface Worker<T> {

    Future<T> doAsync();

    }
    Worker可以通过以下方式使用:
    Future<Integer> future = worker.doAsync();

    // some work here

    Integer result = future.get(); // waits till async work is done
    Future可以是标准 java Future。但我建议您使用 Guava 库中的 ListenableFuture

    关于design-patterns - 回调/命令与EventListener/观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8951276/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com