4

我坚持为我的问题提出一个干净的设计(下)。我已经考虑过发布/订阅或观察者模式,但我的问题似乎与这些方法相反,除非我没有正确思考。也许中介者模式会起作用,但由于某种原因,它对我来说仍然不太合适。所以,这里需要什么设计方面的帮助,请告诉我:)

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

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

4

1 回答 1

3

您当前的想法听起来不错,但我会进行以下调整:

  • 经理不需要单身;

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

例如

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);
于 2012-12-23T05:23:34.257 回答