الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرمافزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفهجویی در زمان و تولید کد های با کیفیت، توسعهپذیر و انعطافپذیر استفاده میکنیم. در این مطلب قصد داریم الگوی طراحی Mediator را معرفی کنیم.
الگوی طراحی Mediator یک الگوی طراحی رفتاری(Behavioral) است که با فراهم کردن یک بستر ارتباطی مرکزی میان اجزاء مختلف، اتصال مستقیم بین آنها را از بین میبرد. این شئ واسط مسئول مدیریت ارتباط بین اجزاء مختلف است.
الگوی Mediator از چندین جزء تشکیل شده است:
الگوی Mediator می تواند در سیستم هایی که اشیا با هم ارتباط زیادی دارند مفید باشد. با تعریف یک شی Mediator، ارتباط مستقیم بین اشیاء کاهش مییابد و سیستم را انعطافپذیرتر و نگهداری آن را آسانتر میکند.
برای مثال، سیستمی را در نظر بگیرید که شامل اجزای متعددی است که باید با یکدیگر ارتباط برقرار کنند. بدون الگوی Mediator، این اجزا باید مستقیماً با یکدیگر ارتباط برقرار کنند که منجر به ایجاد وابستگی شدید بین آنها می شود. با بکارگیری از الگوی Mediator، اجزاء از طریق یک شی Mediator مرکزی با هم ارتباط برقرار میکنند که وابستگی ها را کاهش میدهد و مدیریت کد را آسانتر میکند.
در ادامه یک نمونه کد C# برای الگوی طراحی Mediator آورده شده است:
// Mediator interface
interface IMediator
{
void Notify(object sender, string eventName);
}
// Colleague abstract class
abstract class Colleague
{
protected IMediator mediator;
public Colleague(IMediator mediator)
{
this.mediator = mediator;
}
}
// Concrete colleague class
class ConcreteColleagueA : Colleague
{
public ConcreteColleagueA(IMediator mediator) : base(mediator) { }
public void Send(string message)
{
Console.WriteLine("Colleague A sends message: " + message);
mediator.Notify(this, "MessageA");
}
public void Receive(string message)
{
Console.WriteLine("Colleague A receives message: " + message);
}
}
// Concrete colleague class
class ConcreteColleagueB : Colleague
{
public ConcreteColleagueB(IMediator mediator) : base(mediator) { }
public void Send(string message)
{
Console.WriteLine("Colleague B sends message: " + message);
mediator.Notify(this, "MessageB");
}
public void Receive(string message)
{
Console.WriteLine("Colleague B receives message: " + message);
}
}
// Concrete mediator class
class ConcreteMediator : IMediator
{
private ConcreteColleagueA colleagueA;
private ConcreteColleagueB colleagueB;
public void SetColleagueA(ConcreteColleagueA colleagueA)
{
this.colleagueA = colleagueA;
}
public void SetColleagueB(ConcreteColleagueB colleagueB)
{
this.colleagueB = colleagueB;
}
public void Notify(object sender, string eventName)
{
if (sender == colleagueA && eventName == "MessageA")
{
colleagueB.Receive("MessageA");
}
else if (sender == colleagueB && eventName == "MessageB")
{
colleagueA.Receive("MessageB");
}
}
}
// Client class
class Client
{
static void Main(string[] args)
{
// Create mediator and colleagues
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
// Set colleagues on mediator
mediator.SetColleagueA(colleagueA);
mediator.SetColleagueB(colleagueB);
// Send messages between colleagues
colleagueA.Send("Hello from Colleague A");
colleagueB.Send("Hi from Colleague B");
Console.ReadKey();
}
}
در این مثال، ما یک رابط Mediator داریم که متد Notify را برای ارتباط بین اشیاء تعریف می کند. کلاس انتزاعی Colleague یک فیلد IMediator تعریف میکند و آن را از طریق متد سازنده دریافت میکند. ConcreteColleagueA و ConcreteColleagueB دو پیاده سازی از کلاس Colleague هستند و یک متد Send برای ارسال پیام به Mediator و یک متد Receive برای دریافت پیام از Mediator دارند.
کلاس ConcreteMediator رابط IMediator را پیاده سازی می کند و اشیاء مورد نظر یعنی ConcreteColleagueA و ConcreteColleagueB را در خود نگه داری میکند. همچنین متد Notify را برای مدیریت ارتباط بین اشیاء پیاده سازی می کند.
در نهایت در کلاس Client، Mediator و اشیاء Colleague را ایجاد می کنیم سپس اشیاء را به واسطه معرفی میکنیم. در صورت فراخوانی متد های موردنظر، ارتباط اشیاء از طریق واسط انجام میشود.
به طور خلاصه، الگوی Mediator با متمرکز کردن ارتباطات از طریق یک شئ مرکزی، اتصال مستقیم بین اشیاء را ازبین میبرد و مدیریت سیستم را آسانتر میکند.
برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همهی الگو های طراحی میشود، برای شما قرار گرفته است.
من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که مینویسم بدردتون بخوره.
ثبت دیدگاه