1

我们有一个框架模型和很多组件。几乎每个组件的几乎每个框架Update()函数都由框架模型控制器调用(比如 Unity3d,所有发生的事情都发生在一个线程中)。我们的组件会"Targets"改变其中的一些属性(例如位置)并希望提高其他组件"Consumers"(例如导弹)关于该事实的高度。

如果我们使用普通的 C# 事件模型并从中“引发”事件,"Targets"我们将得到非常长的Update调用。一个可以冻结我们所有基于框架的应用程序。所以我们不能像我们想要的那样真正使用 C# 事件。

我们做了什么:对于每个组件,我们通过将所有新数据推送到列表中的操作"Consumer"订阅事件,并且在更新调用时,我们遍历新数据列表并进行更新。"Targets""Component"

所以我的问题是:有没有办法概括这种方法(比如说,如果我们不仅希望目标影响我们的导弹,而且"winds"还有自己的传入数据(例如方向和温度))以使代码看起来不错?

有没有更正确的方式在框架模型中发送事件?

4

1 回答 1

1

如果我理解正确,那么您现在正在使用修改后的观察者模式。Targets然后是观察变化或发布者的主题。Consumer是声明通知方法的观察者接口,订阅者。如果您现在将观察者功能提取到一个单独的类中,其他类可以从中受益:

// info to send to all active missiles
public class MissileInfoMessage { }

// all missile classes should implement:
public interface MissileInfoSubscriber {
    void Notify (MissileInfoMessage msg);
}

public class MissileInfoBroker {
    List<MissileInfoSubscriber> missileInfoSubscribers;
    // targets, winds, airplanes calls this to get all missiles notified
    public void NotifyMissiles (MissileInfoMessage msg) {
        foreach (MissileInfoSubscriber missile in missileInfoSubscribers) {
            missile.Notify (msg);
        }
    }
    // missiles register when they got fired
    public void Register (MissileInfoSubscriber s) {
        missileInfoSubscribers.Add (s);
    }
    // and deregister if their job is done
    public void Unregister (MissileInfoSubscriber s) {
        missileInfoSubscribers.Remove (s);
    }
}
于 2012-08-17T08:34:06.967 回答