معرفی الگوی طراحی Mediator

معرفی الگوی طراحی Mediator

مدت مطالعه : 4 دقیقه

27 اسفند 1401

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

الگوی طراحی Mediator یک الگوی طراحی رفتاری(Behavioral) است که با فراهم کردن یک بستر ارتباطی مرکزی میان اجزاء مختلف، اتصال مستقیم بین آنها را از بین می‌برد. این شئ واسط مسئول مدیریت ارتباط بین اجزاء مختلف است.

الگوی Mediator از چندین جزء تشکیل شده است:

  • Mediator: یک رابط برای ارتباط بین اشیاء تعریف می کند.
  • ConcreteMediator: رابط Mediator را پیاده سازی می کند و ارتباط بین اشیاء را برقرار می کند.
  • Colleague: رابطی که اشیاء مورد استفاده در Mediator باید آن را پیاده سازی کنند.
  • ConcreteColleague: اشیائی که در Mediator مورد استفاده قرار می‌گیرند. این اشیاء رابط Colleague را پیاده سازی می‌کنند.
mediator gof

الگوی 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 با متمرکز کردن ارتباطات از طریق یک شئ مرکزی، اتصال مستقیم بین اشیاء را ازبین می‌برد و مدیریت سیستم را آسان‌تر می‌کند.

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

design patterns

ایجاد کننده (Creational):الگوی طراحی Factory 
الگوی طراحی Builder 
الگوی طراحی Singleton 
الگوی طراحی Prototype 
الگوی طراحی Abstract Factory 
ساختاری (Structural):الگوی طراحی Adapter 
الگوی طراحی Bridge 
الگوی طراحی Composite 
الگوی طراحی Decorator 
الگوی طراحی Facade 
الگوی طراحی Flyweight 
الگوی طراحی Proxy 
رفتاری (Behavioral):الگوی طراحی Chain of Responsibility 
الگوی طراحی Command 
الگوی طراحی Interpreter 
الگوی طراحی Mediator 
الگوی طراحی Memento 
الگوی طراحی Observer 
الگوی طراحی State 
الگوی طراحی Strategy 
الگوی طراحی Template Method 
الگوی طراحی Visitor 
الگوی طراحی Iterator 
  • اشتراک گذاری:
محمدرضا باباخانی
محمدرضا باباخانی

من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که می‌نویسم بدردتون بخوره.

آخرین مطالب

سرویس مش؛ ساده سازی ارتباطات میکروسرویس و افزایش رؤیت پذیری

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

اهمیت محاسبات لبه یا Edge Computing

ا توجه به سرعت تحول فناوری، یکی از مفاهیمی که توجه زیادی را به خود جلب کرده و نحوه تعامل ما با سیستم های دیجیتال را تغییر می دهد، محاسبات لبه (Edge Computing) است.

معماری رویداد محور چیست؟

معماری رویداد محور (EDA) یک الگوی طراحی نرم افزار است که در توسعه نرم افزار های مدرن به طور چشمگیری محبوب شده است. در این معماری، جریان داده ها با وقوع رویدادها تعیین می شود. بر خلاف سیستم های متمرکز سنتی که دائماً در حال بررسی وضعیت جدید هستند. معماری رویداد محور به ویژه برای سیستم هایی مفید است که به پردازش حجم زیادی از داده ها بصورت بلادرنگ(real-time) نیاز دارند.

ثبت دیدگاه