2014年09月18日

メディエーター

Mediator

「仲介者」と訳される。
「同僚(仲間)」はお互いを直接は知らず、常に仲介者を介する。
あまり出番ないけれど、バシっと決まる場合も偶にある。

サンプルコード

    // 仲介者の抽象親クラス
    abstract class Mediator
    {
        public abstract void SendAll(string message); 
    }
    // 仲介者
    class ConcreatMediator : Mediator
    {
        List<Colleague> _colleagues = new List<Colleague>();

        public void Regist(Colleague colleague){_colleagues.Add(colleague);}


        public override void SendAll(string message)
        {
            _colleagues.ToList().ForEach(_coll => _coll.Notify(message));
        }
    }
    // 同僚の抽象親クラス
    abstract class Colleague
    {
        protected Mediator _mediator;

        public Colleague(Mediator mediator)
        {
            _mediator = mediator;
        }

        public abstract void Send(string message);
        public abstract void Notify(string message);
    }
    // 同僚A
    class ColleagueA : Colleague
    {
        public ColleagueA(Mediator mediator) : base(mediator) { }

        public override void Send(string message){base._mediator.SendAll(message);}

        public override void Notify(string message) { Console.WriteLine("ColleagueA : " + message); }
    }
    // 同僚B
    class ColleagueB : Colleague
    {
        public ColleagueB(Mediator mediator) : base(mediator) { }

        public override void Send(string message) { base._mediator.SendAll(message); }

        public override void Notify(string message) { Console.WriteLine("ColleagueB : " + message); }
    }
    // 同僚C
    class ColleagueC : Colleague
    {
        public ColleagueC(Mediator mediator) : base(mediator) { }

        public override void Send(string message) { base._mediator.SendAll(message); }

        public override void Notify(string message) { Console.WriteLine("ColleagueC : " + message); }
    }



これらを使う側のサンプルコード
    class Tester8
    {
        static void Main(string[] args)
        {
            var mediator = new ConcreatMediator();
            var cA = new ColleagueA(mediator);
            var cB = new ColleagueB(mediator);
            var cC = new ColleagueC(mediator);

            mediator.Regist(cA);
            mediator.Regist(cB);
            mediator.Regist(cC);

            cA.Send("Is anyone there ?");
            cC.Send("Who cares?");
        }
    }


似た感じの実装パターン

クラス間で直接に参照を持ちたくない場合、仲介者のようになんらかを介在させることは割とよく使います。
    public static class Mediator
    {
        public static event Action<string> Notify;
        public static void SendAll(string message)
        {
            if (Notify != null) Notify(message);
        }
    }

    class collA
    {
        public collA()
        {
            Mediator.Notify += message => Console.WriteLine("collA :" + message);
        }

        public void Send(string message) { Mediator.SendAll(message); }
    }
    class collB
    {
        public collB()
        {
            Mediator.Notify += message => Console.WriteLine("collB :" + message);
        }
        public void Send(string message) { Mediator.SendAll(message); }
    }

    class Tester8
    {
        static void Main(string[] args)
        {
            var cA = new collA();
            var cB = new collB();

            cA.Send("Who knows ?");
        }
    }


ここでは仲介者を静的クラスとして定義しましたが、アプリケーションクラスやコンテクストクラスのような場所に実装する場合が多いです。


posted by RR at 00:38 | Comment(0) | デザインパターン | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。