Mediator

GOF Intent:
Define an objcet that encapsulates how a set of objects interact. Mediator promote loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.

Mediator يک Object است که ارتباط بين Object هاي ديگر را مديريت مي‌کند. به جاي اينکه Object هاي مرتبط مستقيما با هم تعامل داشته باشند، با واسطه Mediator صحبت مي کنند.

فلسفه وجود Mediator اين است که نحوه Communication ديگر Object ها را در خود encapsulate کند.

فوايد Mediator:

  • باعث مي شود که وابستگي Object ها (coupling) به هم کاهش يابد.
  • با وجود Mediator مي توان نحوه تعامل و ارتباط Objectها را تغيير داد، بدون اينکه نياز به تغيير خود آنها باشد.


اجزاي تشکيل دهنده Mediator Pattern:
Colleague:
در اين Pettern به Object هايي که قرار است با هم ارتباط داشته باشند، Colleague گفته مي شود.
Mediator:
Object اي که پياده سازي نحوه ارتباط در آن انجام مي شود.

Mediator

متدهايي که لازم است در اين Pattern پياده شوند بدين صورت است:

Mediator

کاربرد هاي Mediator Pattern:
Mediator Pattern دو تيپ کاربرد اصلي دارد

  1. براي تبادل پيغام بين Object هاي مشابه بر اساس گروه بندي و غيره. مانند شبکه هاي اجتماعي که کاربران بر اساس گروه بنديهاي موجود به کاربران گروه دلخواه پيام مي فرستند يا چيزي را share مي کنند.
  2. براي ايجاد هماهنگي بين Object ها در وضعيت هاي مختلف. فرض کنيد يک GUI داريم که اجزاي آن با انتخاب يکي يا بقيه به شکل هاي مختلف Disable يا Enable مي شوند. مي توان مديريت اين کار را در Mediator انجام داد.

نمونه کد:

public interface IColleague {
   public void receiveMessage(String msg);
   public void sendMessage(Mediator aMediator, String msg);
}


public abstract class Mediator {
   protected ArrayList<IColleague> listColleagues = new
             ArrayList<IColleague>();

   public abstract void distributeMessage(IColleague sender, String msg);
   public abstract void registerColleague(IColleague aColleague);
}


public class ConcreteColleague implements IColleague {
   private String name;

   public ConcreteColleague(String name){
      this.name = name;
   }

   public void receiveMessage(String msg) {
      System.out.println(name+” Received message: “+msg);
   }

   public void sendMessage(Mediator aMediator, String msg) {
      aMediator.distributeMessage(this, msg);
   }
}


public class ConcreteMediator extends Mediator {

   public void distributeMessage(IColleague sender, String msg){
      for (IColleague aColleague : listColleagues){
         if (aColleague != sender)
            aColleague.receiveMessage(msg);
      }
   }

   public void registerColleague(IColleague aColleague){
      listColleagues.add(aColleague);
   }

}


public static void main(String[] args){
   IColleague c1 = new ConcreteColleague(“Colleague1″);
   IColleague c2 = new ConcreteColleague(“Colleague2″);
   IColleague c3 = new ConcreteColleague(“Colleague3″);

   Mediator m1 = new ConcreteMediator();
   Mediator m2 = new ConcreteMediator();

   m1.registerColleague(c1);
   m1.registerColleague(c2);
   c1.sendMessage(m1, “message from c1 to m1 group”);

   m2.registerColleague(c2);
   m2.registerColleague(c3);
   c1.sendMessage(m2, “message from c1 to m2 group”);
}

خروجي:

run:
Colleague2 Received message: message from c1 to m1 group
Colleague2 Received message: message from c1 to m2 group
Colleague3 Received message: message from c1 to m2 group

مثال 2:
به جاي ارسال و دريافت پيام مي توان از Mediator براي نظم بخشيدن به وضعيت Object ها در ارتباط با هم استفاده کرد.

در اين مثال با انتخاب از combobox يا فشردن يک Button يا تيک زدن يک Checkbox وضعيت اجزاي صفحه تغيير مي کند.

public interface Mediator{

   public void gotoState1();
   public void gotoState2();
   public void gotoState3();
}


public class ConcreteMediator implements Mediator{

   Button btn1;
   Button btn2;
   CheckBox check1;
   CheckBox chech2;
   ComboBox combo1;
   Label label1;
   ProgressBar = progress1;

   public void registerBtn1(Button btn1){
      this.btn1 = btn1;
   }
   //Other register methods
   …

   public void gotoState1(){
      btn1.enabled = false;
      btn2.enabled = true;
      Progress1.doProgress();
      Label1.value = “State 1″;
      ….
   }

   public void gotoState2(){
      ….
   }
   ….
}


public interface GUIElement{
   public void execute();
}


public class Button extends GUIButton implements GUIElement{

   Mediator m;

   public void execute(){
      m.gotoState1();
   }
}

// other Colleagues implementation:

فايده هاي Mediator Pattern:

  1. کاهش Subclassing: اگر نحوه ارتباط در خود Object پياده شده بود، براي تغيير آن بايد Object جديدي Extends مي شد. اما در اين حالت فقط Mediator در صورت لزوم Extends مي شود.
  2. کاهش Coupling بين Object ها
  3. با وجود Mediator همه Objectها تنها با Mediator ارتباط دارند. بنابراين ارتباط چند به چند با وجود Mediator تبديل به يک به چند مي شود و اين باعث ساده تر شدن و قابل فهم تر شدن برنامه مي شود.
  4. با وجود Mediator تعامل و Communication بين Object ها از خودشان مستقل مي شود و بدين ترتيب بطور مجزا مي توان روي آن تمرکز نمود.
  5. با وجود Mediator کنترل ارتباط بين Object ها در يک جا و بطور متمرکز انجام مي شود.



منبع ها:

  1. Design Patterns – Elements of Reusable Object Oriented Software (GOF) By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
  2. Mediator in Wikipedia
  3. Mediator in Devlake

با برچسب:
پست شده در Design Pattern

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*


× پنج = 20

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

تماس با من: admin@paspars.com