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ı:
/// <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