C# Mediator Pattern Kullanımı - OOP 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.


Anlaşılması zor ve karmaşık yapılarda aracı nesne olarak kullanılır. Bir çok nesne birbirleriyle iletişime geçmek yerine sadece bu aracı nesne ile bağlanırlar. Buda yapılan tüm karmaşık faaliyetleri gizler ve kullanıcıların etkileşimleri, sistemi daha rahat anlamasını sağlar.


Kısaca 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.


İnternette dolaşan popular bir örnek var havaalanı ile ilgili havaalanı olmasa uçaklar ben şimdi iniyorum kimse inmesin gibi birbirleriyle konuşsalar oluşacak kaosu bir düşünün işte burada havaalanı mediator tasarım deseninin görevini üstlenerek uçakları tek bir yerden yönetiyor. Şimdi bu örneği koda dökelim:

UML Şeması:


Kod: 

/// <summary>
    /// Mediator
    /// </summary>
    public interface IAirport
    {
        void Register(AirlineBase airline);
        bool GiveLandingPermission(string flightCode);
    }

    /// <summary>
    /// Concrete Mediator
    /// </summary>
    public class AtaturkAirport:IAirport
    {
        private Dictionary<string, AirlineBase> _planes;

        public AtaturkAirport()
        {
            _planes = new Dictionary<string, AirlineBase>();
        }

        public void Register(AirlineBase airline)
        {
            if (!_planes.ContainsValue(airline))
                _planes.Add(airline.FlightCode, airline);

            airline.Airport = this;
        }

        public bool GiveLandingPermission(string flightCode)
        {
            if (_planes.ContainsKey(flightCode))
                return true;
            else
                return false;
        }
    }
    /// <summary>
    /// Collague
    /// </summary>
    public abstract class AirlineBase
    {
        public string FlightCode { get; set; }
        public IAirport Airport { get; set; }

        public virtual void GetLandingPermission()
        {
            if (Airport != null)
            {
                bool hasPermissionForLanding = 
                       Airport.GiveLandingPermission(FlightCode);
                if (hasPermissionForLanding)
                    Console.WriteLine("Inis izni verildi.");
                else
                    Console.WriteLine("Inis izni verilmedi!");
            }
            else
                Console.WriteLine("Ucak kaydı yapılmamış. İniş   
                        izni yok!");
        }
    }
    /// <summary>
    /// Concrete Collague
    /// </summary>
    public class THYAirline: AirlineBase
    {
        public override void GetLandingPermission()
        {
            Console.WriteLine(FlightCode + " nolu THY ucağı   
             inis icin izin gonderdi.");
            base.GetLandingPermission();
        }
    }
    /// <summary>
    /// Concrete Collague
    /// </summary>
    public class PegasusAirline:AirlineBase
    {
        public override void GetLandingPermission()
        {
            Console.WriteLine(FlightCode + " nolu Pegasus ucağı   
                  inis icin izin gonderdi.");
            base.GetLandingPermission();
        }
    }

Çıktı:

0 yorum :

Yorum Gönder