2

我正在做一个关于 GRAPS 和设计模式的学校项目。它基本上是一个带有网格的游戏,对象和玩家都可以在上面移动。我正在考虑使用调解器来确定物体应该降落的确切位置。

每个同事(在这种情况下是每个项目和网格)都应该知道它的 Mediator 对象。(Design Patterns, Gamma et al.) 正因为如此,我想知道让这个中介器成为单例是否会被认为是一个好的设计选择。中介者是完全无状态的,并且对于每个对象都是相同的,从而满足单例模式规定的适用性要求。

4

1 回答 1

1

我知道已经晚了,但请检查以下调解器实施......

public sealed class Mediator
{
    private static Mediator instance = null;
    private volatile object locker = new object();
    private MultiDictionary<ViewModelMessages, Action<Object>> internalList =
        new MultiDictionary<ViewModelMessages, Action<object>>();

    #region Constructors.
    /// <summary>
    /// Internal constructor.
    /// </summary>
    private Mediator() { }

    /// <summary>
    /// Static constructor.
    /// </summary>
    static Mediator() { }
    #endregion

    #region Properties.
    /// <summary>
    /// Instantiate the singleton.
    /// </summary>
    public static Mediator Instance
    {
        get
        {
            if (instance == null)
                instance = new Mediator();
            return instance;
        }
    }
    #endregion

    #region Public Methods.
    /// <summary>
    /// Registers a Colleague to a specific message.
    /// </summary>
    /// <param name="callback">The callback to use 
    /// when the message it seen.</param>
    /// <param name="message">The message to 
    /// register to.</param>
    public void Register(Action<Object> callback, ViewModelMessages message)
    {
        internalList.AddValue(message, callback);
    }

    /// <summary>
    /// Notify all colleagues that are registed to the 
    /// specific message.
    /// </summary>
    /// <param name="message">The message for the notify by.</param>
    /// <param name="args">The arguments for the message.</param>
    public void NotifyColleagues(ViewModelMessages message, object args)
    {
        if (internalList.ContainsKey(message))
        {
            // forward the message to all listeners.
            foreach (Action<object> callback in internalList[message])
                callback(args);
        }
    }
    #endregion
}

此类使用 aDictionary<[enum], Action<T>>进行调解。这门课是我修改的,但最初是从这里取来的。它说 MVVM,但没有理由不能在其他实现中工作。

这是一个单例调解器,可以如链接文章中所示使用。

我希望这会有所帮助,并对迟到的回复感到抱歉。

于 2013-09-20T08:47:11.923 回答