如何通过一个处理程序处理多个事件源

本文关键字:处理 程序 事件源 一个 何通过 | 更新日期: 2023-09-27 17:49:31

我一直在为我的问题想出一个干净的设计。我考虑过pub/sub或observer模式,但我的问题似乎与这些方法相反,除非我只是没有正确思考。也许中介人模式会起作用,但由于某些原因,它对我来说仍然不太合适。所以,这里需要什么设计方面的帮助,请告诉我:)

我的问题是,我需要一个处理程序,可以处理来自多个来源的事件。我需要一个热键管理器,可以从多个地方管理事件。IE。如果遇到按键,则应该执行一些操作。或者,如果按下麦克风上的按钮(不同的来源),则应该发生动作。

我目前的想法是将管理器实现为单例(不是这个的巨大粉丝…),并在管理器中注册类。类将需要实现一个接口,该接口将保证管理器将附加到的某个事件(当它们被注册时)。我只是不喜欢这样,因为类需要引发这个事件,这不是由合同本身保证的事情

如何通过一个处理程序处理多个事件源

你目前的想法听起来不错,但我想做以下调整:

  • 不需要manager为单例;

  • 事件源不需要向热键管理器注册它们自己,一些其他类(一个构建器)可以负责向管理器注册它们,这消除了源对管理器的依赖。

public class HotKeyManager
{
    public void RegisterKeySource(IKeySource source)
    {
        source.OnKeyPress += this.KeyPressHandler;
    }
    public void KeyPressHandler(object sender, KeyPressEventArgs args)
    {
        // ...
    }
    // ...
}
public interface IKeySource
{
    event EventHandler<KeyPressEventArgs> OnKeyPress;
    // ...
}

其他类处理源注册:

var hotKeyManager = new HotKeyManager();
var keySource = new MyKeySource(); // Implements IKeySource
hotKeyManager.RegisterKeySource(keySource);