当订户不知道它是单例时,单例与事件的依赖关系

时间:2014-03-26 04:12:04

标签: oop design-patterns

有一个由UI ControllerProcessor组成的应用程序。 UI Controller收到用户的请求并将其传递给ProcessorProcessor有一个简单的界面:只有一个Process(input)方法。

Processor可能是单身人士,也可能不是,UI Controller不应该知道。

现在,Processor应该向UI Controller发回一些进度通知。虽然我可以向Processor可以订阅的UI Controller界面添加一个活动,但我不知道如何在单身Processor的情况下使其发挥作用:

  • 只有一次
  • 订阅进度事件
  • Processor不应保留对UI Controller个实例的引用,以便在需要时释放内存
  • 进度事件处理程序是特定于UI的,因此无法取消UI Controller

您如何设计它以便UI Controller无关心Processor是否是单身?

2 个答案:

答案 0 :(得分:1)

创建UIController并引用Processor接口(构造函数注入)。 UIController不知道接口的实现是否是单例。将Processor方法更改为Process(input, notifyCallback),以便Processor可以在不保留UIController引用的情况下发出通知。 notifyCallback将是UIController中实现的功能或界面(取决于语言)。

答案 1 :(得分:0)

您可以通过在Processor类中使用静态事件并在UIController中注册它来实现所需的结果。

private delegate void ProgressDelegate(Processor process, object data);

class Processor
{
    public static event ProgressDelegate ProcessProgress;
    private void method()
    {
        //....your code
        if (ProcessProgress != null)
            ProcessProgress(this, new object());
    }
}

可以使用UIController注册事件,而无需担心对象。一旦事件被触发,您将传递处理器对象,并且UIController可以继续。

class UIController
{
    static UIController()
    {
        Processor.ProcessProgress += new ProgressDelegate(HandleProcessProgress);
    }

    static void HandleProcessProgress(Processor p, object data)
    {
    }
}