Mohsen Farokhi - محسن فرخی
Mohsen Farokhi - محسن فرخی
خواندن ۳ دقیقه·۵ سال پیش

الگوی Mediator

الگوی Mediator برای کاهش پیچیدگی ارتباطات بین اشیاء یا کلاسهای مختلف استفاده می شود.
این الگو یک کلاس واسطه را ارائه می دهد که به طور معمول کلیه ارتباطات بین طبقات مختلف را کنترل می کند.
در این مطلب مثال برج مراقبت را خواهیم دید.
الگوی Mediator
الگوی Mediator

برای مثال، هواپیماهایی را در نظر می گیریم که بجای صحبت کردن با یک برج مراقبت، با یکدیگر صحبت می کنند. یک هواپیمایی که قصد کم کردن ارتفاع را دارد باید به تمام هواپیماهای موجود اطلاع رسانی می کند و با دریافت فاصله خود نسبت به هواپیماهای دیگر، برای تمام هواپیماها محاسبات انجام دهد. در نظر داشته باشید که محاسبات نیز ممکن است بسته به مدل هواپیما متفاوت باشد. در ضمن اگر یک مدل جدید هواپیما اضافه شود باید محاسبات تغییر داده شود و آن مدل جدید اضافه شود.

بنابراین برای جلوگیری از این پیچیدگی ها، برج مراقبت را به عنوان واسطه در نظر می گیریم. برج مراقبت علاوه بر ایجاد ارتباطات، وظیفه کنترل کردن را نیز دارد. یعنی قبل از اینکه هواپیمایی اعلام کند که دارد ارتفاع کم می کند، باید بررسی شود که آیا اجازه کم کردن ارتفاع را دارد یا خیر.

برای شروع، برج مراقبت خود را ایجاد می کنیم که دارای لیستی از هواپیماهای است که قرار است آنها را کنترل کند. یک متد register نیز دارد که هواپیماهایی که در محدوده قرار می گیرند باید از آن برای register شدن استفاده کنند. و همچنین برای هواپیماهایی که از محدوده خارج می شوند نیز یک متد remove داریم.

برج مراقبت قرار بود مسئول کنترل هواپیما ها نیز باشد. بنابراین یک متد AllowChangeHeight نیز داریم که به هواپیما می گوید اجازه تغییر ارتفاع دارد یا خیر.

public interface IWatchtower { List<Airplain> AirplainList { get; set; } void Register(Airplain airplain); void Remove(Airplain airplain); bool AllowChangeHeight(); }
public class MehrabadTower : IWatchtower { public List<Airplain> AirplainList { get; set; } = new List<Airplain>(); public bool AllowChangeHeight() { var result = false; foreach (var item in AirplainList) { if (item is Airbus) { var temp = item as Airbus; //Calc Result } if (item is Foker) { var temp = item as Airbus; //Calc Result } if (item is Topolof) { var temp = item as Topolof; //Calc Result } if (item is Bouing) { var temp = item as Bouing; //Calc Result } } return result; } public void Register(Airplain airplain) { AirplainList.Add(airplain); } public void Remove(Airplain airplain) { AirplainList.Remove(airplain); } }

و سپس کلاس Airplane خود را می نویسم.

هر هواپیما باید حتما در کنترل یک برج مراقبت باشد بنابراین در constructor کلاس Airplane یک IWatchtower را می گیرم و هواپیما در آن register می شود و زمانی هم که کلاس dispose می شود باید remove شود. همچنین فاصله ای که برای هر مدل هواپیما باید مشخص شود.

public abstract class Airplain : IDisposable { private readonly IWatchtower _tower; public Airplain(IWatchtower tower) { _tower = tower; _tower.Register(this); } public string Name { get; set; } public void ChangeElevation() { if (_tower.AllowChangeHeight()) { // } } public void Dispose() { _tower.Remove(this); } public int AcceptableDistance { get; set; } }

و در نهایت مدل های مختلف هواپیما را پیاده سازی می کنم.

public class Airbus : Airplain { public Airbus(string uniqName, IWatchtower tower) : base(tower) { AcceptableDistance = 1000; Name = $&quotAirbus {uniqName}&quot } }
public class Foker : Airplain { public Foker(string uniqName, IWatchtower tower) : base(tower) { Name = $&quotFoker {uniqName}&quot AcceptableDistance = 500; } }
public class Topolof : Airplain { public Topolof(string uniqName, IWatchtower tower) : base(tower) { Name = $&quotTopolof {uniqName}&quot AcceptableDistance = 800; } }
public class Bouing : Airplain { public Bouing(string uniqName, IWatchtower tower) : base(tower) { Name = $&quotBouing {uniqName}&quot AcceptableDistance = 200; } }

برای استفاده هم یک برج مراقبت ساخته می شود و هر هواپیما، خود را تحت کنترل یک برج مراقبت قرار می دهد.

IWatchtower mehrabad = new MehrabadTower(); Airbus airbus = new Airbus(&quot001&quot, mehrabad); Airbus airbus2 = new Airbus(&quot002&quot, mehrabad); Foker foker = new Foker(&quot001&quot, mehrabad);

پایان

الگوی Mediatordesign patternsالگوهای طراحیمحسن فرخی
شاید از این پست‌ها خوشتان بیاید