2

GRAPS とデザイン パターンに関する学校のプロジェクトに取り組んでいます。これは基本的に、プレイヤーだけでなくオブジェクトも移動できるグリッドを備えたゲームです。オブジェクトが着陸する正確な位置を決定するためにメディエーターを使用することを考えていました。

各同僚 (この場合は各アイテムとグリッド) は、それが Mediator オブジェクトであることを認識する必要があります。(Design Patterns, Gamma et al.) このため、このメディエーターをシングルトンにすることが良い設計上の選択と見なされるかどうか疑問に思っていました。メディエーターは完全にステートレスであり、各オブジェクトで同一であるため、Singleton パターンで規定されている適用要件を満たしています。

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
}

このクラスは、Dictionary<[enum], Action<T>>仲介に a を使用します。このクラスは私が修正したものですが、元はここから取られました。MVVM と書いてありますが、他の実装で動作しない理由はありません。

これはシングルトン メディエーターであり、リンクされた記事に示されているように使用できます。

これがお役に立てば幸いです。返信が遅れて申し訳ありません。

于 2013-09-20T08:47:11.923 に答える