Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Iterator Tasarım Deseni - Iterator Design Pattern | Memento Tasarım Deseni - Memento Design Pattern>>

Mediator Tasarım Deseni - Mediator Design Pattern

Yazar harunozer 25 November 2012

Mediator Tasarım Deseni - Mediator Design Pattern Mediator design pattern (aracı tasarım deseni), behavior grubununa ait, çalışmaları birbirleri ile aynı arayüzden türeyen nesnelerin durumlarına bağlı olan nesnelerin davranışlarını düzenleyen tasarım desenidir. dofactory.com a göre kullanım oranı %40 civarındadır.

Bazı durumlarda nesnelerin davranışları kendi türünden başka nesnelere bağlı olabilir. Mediator tasarım deseni birbirleri ile ilişkili olan bu nesneler arasında ki iletişimin ana bir nesne üzerinden (mediator) yapılmasını sağlar. Böylece nesneler arasındaki bağ zayıflatılır ve geliştirme aşamasında kod karmaşasını önler ve kodun yönetilmesini kolaylaştırır. İlk olarak mediator deseninin uml diyagramına göz atalım.

Görüldüğü üzere mediator tasarım deseninde 4 temel yapı bulunur.

  • Mediator: Nesneler arasındaki ilişkiyi sağlayacak metotların tanımlı olduğu arayüz.
  • ConcreteMediator: Nesneler arasındaki ilişkiyi sağlayacak gerçek nesnedir. Mediator arayüzünü uygular. İçinde Colleague ara yüzünden türeyen nesnelerin listesini barındırır.
  • Colleague: ConcreteMediator u kullanarak işlem gerçekleştirecek olan nesnelerin uygulaması gereken arayüzü temsil eder. Kendi içinde ConcreteMediator nesnesi barındırır.
  • ConcreteColleague: ConcreteMediator üzerinden birbirleri ile ilişkili nesnelerdir. Colleague arayüzünü uygularlar.

Örneğin hava alanı kontrolünü düşünelim. Eğer uçaklar iniş, kalkış işlemleri için kule ile değil de birbirleri arasında direkt haberleşerek davransalar; bir uçak bir işlem yapacağı zaman ilgili bütün uçaklarla nasıl iletişime geçeceğini bilmesi ve iletişime geçmesi gerekirdi. Hava alanı kontrolünü mediator deseni ile düşünelim. İlk olarak uçaklar ve kule (aslında farklı hava alanları da olacağından kuleler) gereklidir ve bunların birbirleri ile nasıl iletişime geçeceklerini belirten operasyon tanımlamaları olması gereklidir. Kulenin gerçekleştireceği iniş – kalkış izni vermek gibi operasyonlar “Mediator” arayüzünü temsil eder ve kendisine bağlı olan nesnelerin yani uçakların bilgilerini kendi içinde tutar. Her bir kule de ConcreteMediator yapısına denk düşer ve kendisine bağlı olan uçaklar ile iletişime geçer. Uçakların gerçekleştireceği iniş – kalkış istemek gibi operasyonların tanımlanması ise “Colleague” arayüzünü temsil eder. Uçaklar ise “ConcreteColleague” yapısına denk düşer ve içinde ilgili “Mediator” tipinden nesneyi barındırır.

Bu senaryo üzerinden örnek bir uygulama geliştirelim. Uygulamamızın class diyagramı aşağıdaki gibi olur.

Örnek uygulamamızın kodları açıklamaları ile beraber aşağıdadır.

//mediator yapısı
interface IKule
{
    //Kulenin gerçekleştirmesi gereken operasyonlar
    void UcakKayit(AbsUcak _ucak);
    void InisIzniCevap(string UcusNo);
}

//Colleague yapısı
abstract class AbsUcak
{
    //Uçağın hangi kule ile irtibata geçmesi gerektiğini tutması gerekir.
    public IKule IliskiliKule { get; set; }
    public string UcusNo { get; set; }
    public bool InisIzni { get; set; }
    public void InisIzniIste()
    {
        //uçağın bağlı olduğu kuleden iniş izni istiyor
        IliskiliKule.InisIzniCevap(UcusNo);
    }
    public virtual void SetInisIzni(bool Izin)
    {
        //kule iniş izni isteyen uçağa bu metot ile cevap verir.
        InisIzni = Izin;
        if (InisIzni)
            Console.WriteLine("İniş izni verildi.");
        else
            Console.WriteLine("İniş izni red edildi.");
    }
}
//ConcreteMediator yapısı
class EsenbogaKule : IKule
{
    //Kule kendisine bağlı olan uçakların bilgisini tutmak zorunda ki isteklere buna göre cevap verebilsin.
    private List<AbsUcak> _UcakListe = new List<AbsUcak>();
    public void UcakKayit(AbsUcak _ucak)
    {
        _UcakListe.Add(_ucak);
        //Listeye eklenen AbsUcak nesnesine yöneticisinin bu sınıf olduğunu bildiriyoruz.
        _ucak.IliskiliKule = this;
    }
    public void InisIzniCevap(string UcusNo)
    {
        bool izin = true;
        // eğer başka bir uçağa iniş izni verilmedi ise ilk izin isteyen uçağa izin ver
        if (_UcakListe.Where(u => u.InisIzni == true).Count() > 0)
            izin = false;
        //uçağın cevap alması için barındırdığı metoda cevap verilir.
        _UcakListe.Where(u => u.UcusNo == UcusNo).Single().SetInisIzni(izin);
    }
}
//ConcreteColleague1
class ThyUcak : AbsUcak
{
    //InisIzniIste metotu AbsUcak abstract sınıfından gelir.
    //Kule cevabı mu metot ile verir.
    public override void SetInisIzni(bool Izin)
    {
        Console.WriteLine("Thy Uçuş No:{0} iniş izni istiyor...", UcusNo );
        base.SetInisIzni(Izin);
    }
}
//ConcreteColleague2
class UsaUcak : AbsUcak
{
    //ConcreteColleague1 yapısı için geçerli olanlar bu yapı için de geçerlidir.
    public override void SetInisIzni(bool Izin)
    {
        Console.WriteLine("Usa Uçuş No:{0} iniş izni istiyor...", UcusNo);
        base.SetInisIzni(Izin);
    }
}
class Program
{
    static void Main(string[] args)
    {
        //ilk olarak uçakların bağlı olacağı kule oluşturulur
        IKule kule = new EsenbogaKule();
        //Uçak nesneleri oluşturulur.
        AbsUcak ThyTK001 = new ThyUcak { UcusNo = "ThyTK001"};
        AbsUcak ThyTK002 = new ThyUcak { UcusNo = "ThyTK002"};
        AbsUcak UsaUS001 = new ThyUcak { UcusNo = "UsaUS001"};
           
        //uçak nesneleri kule nesnesine kayıt ettirilir.
        //Uçak nesnesindeki IliskiliKule nesnesi kule nesnesindeki UcakKayit metodunda yapılır.
        kule.UcakKayit(ThyTK001);
        kule.UcakKayit(ThyTK002);
        kule.UcakKayit(UsaUS001);
        //sadece ilk izin isteyen uçağa iniş izni true verilir.
        ThyTK001.InisIzniIste();
        ThyTK002.InisIzniIste();
        ThyTK001.InisIzni = false;
        //ThyTK001 nesnesinin iniş izni iptal edildiği için ThyTK002 nesnesine iniş izni verilir.
        ThyTK002.InisIzniIste();
        Console.ReadKey();
    }
}
 

Bilgisayar dünyasından örnek vermek gerekirse dofactory.com adresindeki cheat uygulamasını örnek olarak gösterebiliriz.

Örnek uygulamayı aşağıdaki linkten indirebilirsiniz.

MediatorSample.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 3  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri