در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش دیزاین پترن (Design Patterns) قسمت 7 : الگوی Mediator

با سلام خدمت همه دوستان توسینسویی ، در ادامه با بحث الگوهای طراحی به شرح الگوی Meditor خواهیم پرداخت

آموزش دیزاین پترن (Design Patterns) قسمت 7 : الگوی Mediator

مقدمه

همان طور که در بخش اول این سری مقالات اشاره کردیم یکی از اصولی که در طراحی نرم افزار باید رعایت شود این است که در طراحی نرم افزار ها کلاس ها و اشیائی که طراحی می شوند باید حداقل وابستگی را به یکدیگر داشته باشند. به این معنی که هرکدام به شکل جداگانه کار خود را انجام بدهند و در صورت نیاز فارغ از این که هرکدام چگونه وظیفه خود را انجام می دهند با یکدیگر تعامل داشته باشند. این تعامل باید به گونه ای باشد که وقتی تغییری در یکی از کلاس ها اعمال شد کلاسی که با کلاس تغییر داده شده همکاری می کند نیازمند تغییر نباشد. به این اصل در طراحی نرم افزار loosly coupling گفته می شود. یکی از الگو های طراحی که در رعایت اصل گفته شده بسیار تاثیر گذار است الگوی mediator می باشد. این الگو شیئی را تعریف می کند که این شیء ارتباط بین مجموعه ای از اشیا دیگر را برقرار می کند و نوع این ارتباط را کپسوله سازی می کند. به این معنی که این الگو زمینه ای برای ارتباط بین اشیا به وجود می آورد به گونه ای که اشیا از ماهیت یکدیگر اطلاعی ندارند و همان طور که از نام این الگو می توان فهمید این الگو یک میانجی بین سایر اشیا دیگر است. این الگو همچنین می تواند پروتکل هایی را قرار دهد که سایر اشیا از آن ها پیروی کنند.

آموزش دیزاین پترن (Design Patterns) قسمت 7 : الگوی Mediator

شرح

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

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

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

طراحی الگوی Mediator

حال به شرح UML الگوی Mediator می پردازیم. همانگونه که در شکل دیده می شود این الگو فقط از دو کلاس تشکیل شده است که با ارسال پیام با یکدیگر ارتباط برقرار می کنند. این کلاس ها عبارتند از:

Colleage یک mediator را ثبت می کند که با استفاده از آن mediator با بقیه اشیا ارتباط برقرار می نماید. ارسال اطلاعات توسط send انجام می شود. این کلاس حتما یک متد Receive دارد که اطلاعات ارسالی بقیه اشیا را توسط آن دریافت می کند.

Mediator با استفاده از دلیگیت Respond پیام رسیده را به کلاس های Colleage ارسال می کند.

آموزش دیزاین پترن (Design Patterns) قسمت 7 : الگوی Mediator

پیاده سازی

نکته هایی که در پیاده سازی این الگو وجود دارد این است که هر شی از کلاس Colleage هنگام ساخته شدن یک شی mediator می گیرند و آن را به صورت private نگهداری می کنند. و نکته دیگر این که هر شی از کلاس Mediator یک لیست از اشیا Colleage نگهداری می کند و آن را به صورت private نگهداری می نماید. برای ارسال به همه اشیا Colleage ثبت شده در یک mediator ما باید نام آنها به همراه تابع Respond آنها را در اختیار داشته باشیم که این کار را می توانیم توسط یک دیکشنری انجام دهیم. ولی راه ساده تر از این کار در زبان C# استفاده از دلیگیت ها است. کد زیر کار کردن این متد را نمایش می دهد.

using System;
using System.Collections.Generic;

namespace MediatorPattern
{
    public class Mediator
    {
        public delegate void Callback(string message, string from);

        private Callback respond;

        public void SignOn(Callback method)
        {
            respond += method;
        }

        public void Block(Callback method)
        {
            respond -= method;
        }

        public void Unblock(Callback method)
        {
            respond += method;
        }

        public void Send(string message, string from)
        {
            respond(message, from);
            Console.WriteLine();
        }
    }

    public class Colleague
    {
        private Mediator mediator;
        protected string name;

        public Colleague(Mediator mediator, string name)
        {
            this.mediator = mediator;
            mediator.SignOn(Receive);
            this.name = name;
        }

        public virtual void Receive(string message, string from)
        {
            Console.WriteLine(name + " received from " + from + ": " + message);
        }

        public void Send(string message)
        {
            Console.WriteLine("Send (From " + name + "): " + message);
            mediator.Send(message, name);
        }
    }

    public class ColleagueB : Colleague
    {
        public ColleagueB(Mediator mediator, string name)
            : base(mediator, name)
        {
        }

        public override void Receive(string message, string from)
        {
            if (!String.Equals(from, name))
                Console.WriteLine(name + " received from " + from + ": " + message);
        }
    }

    static void Main()
{
    Mediator m = new Mediator( );
    Colleague head1 = new Colleague(m,"John");
    ColleagueB branch1 = new ColleagueB(m,"David");
    Colleague head2 = new Colleague(m,"Lucy");
    head1.Send("Meeting on Tuesday, please all ack");
    branch1.Send("Ack");
    m.Block(branch1.Receive);
    head1.Send("Still awaiting some Acks");
    head2.Send("Ack");
    m.Unblock(branch1.Receive);
    head1.Send("Thanks all");
}


}

خروجی کد بالا به شکل زیر خواهد بود.

Send (From John): Meeting on Tuesday, please all ack
John received from John: Meeting on Tuesday, please all ack
David received from John: Meeting on Tuesday, please all ack
Lucy received from John: Meeting on Tuesday, please all ack

Send (From David): Ack
John received from David: Ack
Lucy received from David: Ack

Send (From John): Still awaiting some Acks
John received from John: Still awaiting some Acks
Lucy received from John: Still awaiting some Acks

Send (From Lucy): Ack
John received from Lucy: Ack
Lucy received from Lucy: Ack

Send (From John): Thanks all
John received from John: Thanks all
Lucy received from John: Thanks all
David received from John: Thanks all

در کد بالا وقتی که می خواهیم یک شی از کلاس colleage بسازیم یک شی mediator به همراه نام خود شی به آن اختصاص می دهیم. وقتی هم که می خواهیم یک شی را برای mediator معرفی کنیم تابع send آن شی را به تابع SignOn مربوط به mediator میفرستیم. از دیگر اعمالی که کد بالا انجام می دهد این است که این شی امکان بلاک کردن برخی اشیا را دارد که البته مکانیزم آن بسیار ساده است.یک برنامه چت داینامیک تر و پویاتر از برنامه ارسال ایمیل است. زیرا پیامی که ارسال می شود به سرعت توسط دیگر کاربران دریافت می شود و مانند مثال قبل نیست که فقط یک ایمیل ارسال شود.

استفاده از الگوی Mediator

الگوی Mediator در بسیاری از سیستم های مدرن که از پروتکل Send/receive استفاده می کنند مانند list serverها و چت روم ها استفاده شده است. الگوی mediator علاوه بر ارتباطات انسانی نقش بسیار مهمی در متمرکز کردن ارتباطات بین اشیا دارد. اگر اشیا به طور مستقیم با یکدیگر ارتباط داشته باشند درک ارتباطات آنها بسیار مشکل خواهد بود. پیاده سازی این الگو می تواند نقش بسیار مهمی در کارایی سیستم داشته باشد. زیرا که هرچقدر ارتباطات بین اشیا سریع تر انجام بشود کارایی بالا می رود و گاهی اوقات ممکن است که یک گلوگاه شود. این الگو همچنین در امنیت سیستم ها نیز تاثیر بسیاری دارد. از مزایا و معایب این الگو می توان به موارد زیر اشاره کرد. مزایا:

• اشای همکار (Colleage) را از هم جدا می کند و وابستگی بین آنها را از بین می برد

• اشیا می توانند به راحتی وظایف خود را انجام دهند و بدون داشتن اطلاعات دقیق از اشیا دیگر با آنها ارتباط داشته باشند.

• کنترل ارتباطات با استفاده از این الگو متمرکز می شود.

• ارتباطات اشیا با یکدیگر به آسانی قابل فهم و استفاده مجدد خواهد بود.

معایب

• پیچیدگی کلاس mediator ممکن است بالا باشد.

• در صورت پیاده سازی نادرست ممکن است که فهم کلاس mediator سخت باشد.

الگوی Mediator یک الگوی رفتاری می باشد. Itpro باشید.

نویسنده : مهدی عادلی

منبع : جزیره برنامه نویسی وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

#برنامه_نویسی_شی_گرا #آموزش_design_pattern #آموزش_الگوهای_طراحی #الگوهای_طراحی_در_نرم_افزار #آموزش_برنامه_نویسی_شئ_گرا #آموزش_الگوی_طراحی_mediator #الگوهای_طراحی_شی_گرا
عنوان
1 آموزش دیزاین پترن (Design Patterns) قسمت 1 : اطلاعات پایه رایگان
2 آموزش دیزاین پترن (Design Patterns) قسمت 2 : معرفی الگوها رایگان
3 آموزش دیزاین پترن (Design Patterns) قسمت 3 : Singleton و Adapter رایگان
4 آموزش دیزاین پترن (Design Patterns) قسمت 4 : الگوی Observer رایگان
5 آموزش دیزاین پترن (Design Patterns) قسمت 5 : الگوی Iterator رایگان
6 آموزش دیزاین پترن (Design Patterns) قسمت 6 : الگوی Command رایگان
7 آموزش دیزاین پترن (Design Patterns) قسمت 7 : الگوی Mediator رایگان
8 آموزش دیزاین پترن (Design Patterns) قسمت 8 : الگوی Memento رایگان
9 آموزش دیزاین پترن (Design Patterns) قسمت 9 : الگوی Strategy رایگان
10 آموزش دیزاین پترن (Design Patterns) قسمت 10 :الگوی Factory Method رایگان
11 آموزش دیزاین پترن (Design Patterns) قسمت 11 : الگوی State رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....