我一直在寻找不同的方法来实现对象和类之间的通信,以维持一种解耦的,封装的,面向对象的方法。我发现的内容往往集中在一个特定的实现上,我从未见过比较,也没有看到方法的相对优缺点。我也确定我并不知道这一切。此外,我的特定应用程序严重依赖于用户输入(游戏开发),这增加了另一个因素。
对我来说,基本且最不吸引人的方法是静态类和变量,其中每个对象和类访问变量的集中列表。这显然会非常迅速地变得非常拥挤,并且在我看来,对于除了次要应用之外的任何事情来说,实际上都太笨拙了。我也研究了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;对象和类?我可以通过哪些其他方式实现沟通,无论其是否低劣,以及如何最好地遵循面向对象的做法?
答案 0 :(得分:2)
您可能会受益于使用内置的IObserver和IObservable接口并实现观察者模式,让您的可观察推送通知给订阅的观察者。看一下这个例子:
https://msdn.microsoft.com/en-us/library/ee850490%28v=vs.110%29.aspx
您可能还想查看文章中链接的反应式扩展库,但它们更复杂一些。