Aracı Kalıbı (Mediator Pattern)

Eyl 08, 2013
Yirmi üç çeşit tasarım kalıbından biri olan aracı tasarım kalıbı davranışsal tasarım kalıplarının alt dallarından biri olarak kabul edilir. Aracı kalıbı genel olarak nesnelerin yönetimi, aralarındaki iletişimin merkezi bir noktadan sağlanması ve yönetilmesi için kullanılır. Bu nesneler arasındaki bağı azaltmakta ve sadece bir sınıfı, yönetici sınıf olarak diğer sınıfların koordine edilmesinden sorumlu kılar.

Kalıp genellikle yazılan programın sınıf sayısı kadar kullanılır. Mantık (logic) ve hesaplama (compotation) bu sınıflar arasında dağıtılır. Ayrıca çok gelişmiş programlarda sınıflar arasında iletişim gittikçe daha da karmaşık bir hal alır ve kodun ilerlemesi ile okunaklılığı da bundan etkilenir. Aracı kalıbı kullanıldığında ise iletişim sınıflar arasında doğrudan sağlanmaz. Sınıflar arasında aracı kalıbı bulunur ve sınıfları yönetir. Böylece nesneler arası bağımlılık azalır ve program yönetilmeye ve geliştirilmeye daha elverişli hale gelir. Kısacası arabulucu tasarım deseni, sınıflar arasındaki bağımlılıkları azaltmak ve aralarındaki iletişimi kolaylaştırmak için kullanılır.


Kullanım alanları:
  • Anlaşılması zor ve karmaşık şekilde yapılandırılmış nesneler için kullanılır.
  • Gelişmiş nesnel yapılarda bir nesnede yapılan değişikliğin diğer nesneleri etkilemesini engellemek için kullanılır.
  • Yeni sınıflandırmalara gerek kalmadan nesneler arasında dağıtımı sağlamak için kullanılır.

Avantajları

  • Kolay anlaşılırlık:  Aracı kalıbı collegue(eş görevli)ler tarafından yapılan tüm karmaşık faaliyetleri gizler ve kullanıcıların etkileşimleri, sistemi daha rahat anlamasını sağlar.
  • Çözümlenmiş eş görevliler: Eş görevliler eklenebilir, değiştirilebilir ve kaldırılabilir olduğundan yapısal olarak birbirlerine daha az bağlıdır. Bu nedenle aracı kalıbı ve collegue arası bağımsız olarak kullanılabilir.
  • Protokol kolaylığı: Aracı kalıbı bir kaç merkezi erişim noktası sağladığı için bire bir etkileşimden çok birden çok iletişimi tercih eder.
  • Alt sınıf sınırları: Aracı kalıbı yerel özellik taşıdığından davranış değiştirirken alt sınıf oluşturabilir ancak eşgörevli aynı kalır.

Dezavantajları

  • Karmaşık yapısı: Aracı yapısı genel olarak çok sayıda eş görevli ele aldığından karmaşık bir yapıya sahip olabilir bu da anlaşılmasını ve geliştirilmesini güçleştirir.
     
Aracı tasarım kalıbının UML diyagramı:




Bu yapıların anlaşılması için gerçekleştirilen C# uygulaması ve açıklaması aşağıda görülmektedir. Bu uygulamada ana uygulamanın içinde mediator(aracı) türünden bir de yönetici sınıf tanımlanır. Böylece mediator(aracı) kalıbı diğer sınıflar arasında yönetici durumuna gelerek diğer sınıflardaki katılımcıların koordine edilmesini sağlar.
 

using System;
namespace AraciKalibi
{
    class MainApp
    {
        static void Main()
        {
            SomutAraci sAraci = new SomutAraci();
            SomutKatilimci1 sKatilimci1 =
                        new SomutKatilimci1(sAraci);
            SomutKatilimci2 sKatilimci2 =
                        new SomutKatilimci2(sAraci);
            sAraci.Katilimci1 = sKatilimci1;
            sAraci.Katilimci2 = sKatilimci2;
            sKatilimci1.Gonder("Test Verisi 1");
            sKatilimci2.Gonder("Test Verisi 2");
            Console.ReadKey();
        }
    }

    abstract class Araci
    {
       public abstract void Gonder(string mesaj,Katilimci
                                   katilimci);
    }

    class SomutAraci : Araci
    {
        private SomutKatilimci1 _katilimci1;
        private SomutKatilimci2 _katilimci2;
        public SomutKatilimci1 Katilimci1
        {
            set { _katilimci1 = value; }
        }
        public SomutKatilimci2 Katilimci2
        {
            set { _katilimci2 = value; }
        }
        public override void Gonder(string mesaj, Katilimci
                                    katilimci)
        {
            if (katilimci == _katilimci1)
            {
                _katilimci2.Al(mesaj);
            }
            else
            {
                _katilimci1.Al(mesaj);
            }
        }
    }

    abstract class Katilimci
    {
        protected Araci araci;

        public Katilimci(Araci araci)
        {
            this.araci = araci;
        }
    }

    class SomutKatilimci1 : Katilimci
    {
        public SomutKatilimci1(Araci araci)
            : base(araci)
        {
        }
        public void Gonder(string mesaj)
        {
            araci.Gonder(mesaj, this);
        }
        public void Al(string mesaj)
        {
            Console.WriteLine("Katılımcı 1 tarafından alınan
                               mesaj: " + mesaj);
        }
    }

    class SomutKatilimci2 : Katilimci
    {
        public SomutKatilimci2(Araci araci)
            : base(araci)
        {
        }
        public void Gonder(string mesaj)
        {
            araci.Gonder(mesaj, this);
        }
        public void Al(string mesaj)
        {
            Console.WriteLine("Katılımcı 2 tarafından alınan
                               mesaj: " + mesaj);
        }
    }
}

Koda ait ekran çıktısı: