对象与类通信

时间:2015-08-25 20:05:13

标签: c#

我一直在寻找不同的方法来实现对象和类之间的通信,以维持一种解耦的,封装的,面向对象的方法。我发现的内容往往集中在一个特定的实现上,我从未见过比较,也没有看到方法的相对优缺点。我也确定我并不知道这一切。此外,我的特定应用程序严重依赖于用户输入(游戏开发),这增加了另一个因素。

对我来说,基本且最不吸引人的方法是静态类和变量,其中每个对象和类访问变量的集中列表。这显然会非常迅速地变得非常拥挤,并且在我看来,对于除了次要应用之外的任何事情来说,实际上都太笨拙了。我也研究了MVC和MVVC(足以只提取基础知识),但从我看到它们不适合游戏循环所需的常量输入和机制。最后,我当前选择的方法是一个事件系统,其中静态类包含将委托添加到特定事件的函数,并且当调用事件时,所有这些函数都被执行。我目前的实现基本上是这样的:

public static class EventManager {

    private static Dictionary<EVNT, Delegate> eventTable = new Dictionary<EVNT, Delegate>();

    public static void AddHandler(EVNT evnt, Action action)
    {
        if (!eventTable.ContainsKey(evnt)) eventTable[evnt] = action;
        else eventTable[evnt] = (Action)eventTable[evnt] + action;
    }

    public static void AddHandler<T>(EVNT evnt, Action<T> action)
    {
        if (!eventTable.ContainsKey(evnt)) eventTable[evnt] = action;
        else eventTable[evnt] = (Action<T>)eventTable[evnt] + action;
    }
    //More multi-variable overloads...

    public static void Broadcast(EVNT evnt)
    {
        Delegate d;
        if (eventTable.TryGetValue(evnt, out d))
        {
            Action action = d as Action;
            if (action != null) action();
        }
    }

    public static void Broadcast<T>(EVNT evnt, T param)
    {
        Delegate d;
        if (eventTable.TryGetValue(evnt, out d))
        {
            Action<T> action = d as Action<T>;
            if (action != null) action(param);
        }
    }

    public static void RemoveHandler(EVNT evnt, Action action)
    {
        if(eventTable[evnt] != null)
            eventTable[evnt] = (Action)eventTable[evnt] - action;
        if (eventTable[evnt] == null)
            eventTable.Remove(evnt);
    }

    public static void RemoveHandler<T>(EVNT evnt, Action<T> action)
    {
        if (eventTable[evnt] != null)
            eventTable[evnt] = (Action<T>)eventTable[evnt] - action;
        if (eventTable[evnt] == null)
            eventTable.Remove(evnt);
    }
}

是否有不同或更好的方法来实现这一目标&#39;脱钩&#39;对象和类?我可以通过哪些其他方式实现沟通,无论其是否低劣,以及如何最好地遵循面向对象的做法?

1 个答案:

答案 0 :(得分:2)

您可能会受益于使用内置的IObserver和IObservable接口并实现观察者模式,让您的可观察推送通知给订阅的观察者。看一下这个例子:

https://msdn.microsoft.com/en-us/library/ee850490%28v=vs.110%29.aspx

您可能还想查看文章中链接的反应式扩展库,但它们更复杂一些。