2

我注意到我的大部分代码都是围绕回调构建的。这被认为是“设计缺陷”吗?我应该遵循更好的设计模式吗?

4

6 回答 6

7

我想您可以将观察者模式视为类似于回调的东西。你检查过它们吗?

Pragmatic Programmer一书中,他们提到了一个人等待登机的例子。与其不断询问值机柜台她是否可以登机(投票),不如说当航班准备好时,值机柜台会向所有感兴趣的人公开宣布。

此示例的伪代码可能如下所示:

class Clerk implements CheckInNotifyer {
  BunchOfObservers observers = new Bunch();

  public void addObserver(CheckInObserver observer) {
    observers.add(observer);
  }

  private void notifyListeners() {
    observers.all.notifyCheckIn(new CheckInEvent());
  }
}

class Passenger implements CheckInObserver {
  public void notifyCheckIn(CheckInEvent event) {
    event.getPlane().board();
  }
}

class WaitingArea {
  public init() {
    Passenger passenger = new Passenger();
    Clerk clerk = new Clerk();

    clerk.addObserver(passenger);
  }
}
于 2009-02-26T17:35:57.440 回答
4

它也被称为事件驱动编程

于 2009-02-26T18:07:03.623 回答
3

当您有多个带有回调的过程时,另一个特别有效的选择是使用 WaitHandles。

于 2009-02-26T17:37:22.773 回答
3

这还不错,它只是用非函数式语言进行函数式编程的唯一方法。

于 2009-02-26T18:03:04.880 回答
1

这取决于。对于 Javascript,我更喜欢观察者模式,因为它可以真正知道触发的事件——主要是因为您可以注册和管理多个观察者。但是对于像 AJAX 调用这样的东西,将其包装在一个闭包中并包含回调方法似乎是最干净的方法。

于 2009-02-26T18:04:54.377 回答
-1

在面向对象的语言中,我发现多态性更“干净”(没有强制转换和混乱的函数类型声明)和更面向对象的方法(从接口派生)来实现回调提供的功能。

于 2009-03-01T11:05:43.173 回答