Медиатор паттерн и творчество - PullRequest
3 голосов
/ 21 июня 2011

У меня есть несколько «виджетов», участвующих в презентации, которые должны взаимодействовать друг с другом, но взаимодействия стали достаточно сложными, чтобы гарантировать новый объект для обработки взаимодействий.

Пытаясь работать с посредником в качестве этого объекта, я не понимаю, как эффективно построить участников.Посредник должен знать о виджетах, а виджеты должны знать о посреднике.

Используя приведенные ниже классы игрушек, кто-нибудь может показать мне, как будут выглядеть конструкторы и в каком порядке они обычно создаются?

Cheers,
Berryl

class WidgetOne {       
    Mediator _mediator;
} 

class WidgetTwo {       
    Mediator _mediator;
} 

class Mediator {    
    WidgetOne _widgetOne;
    WidgetTwo _widgetTwo;               
}

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Это действительно зависит от ряда других обстоятельств, но я бы, вероятно, сделал это:

class Mediator {    
    WidgetOne _widgetOne;
    WidgetTwo _widgetTwo;   

    void setWidgetOne(WidgetOne one){_widgetOne = one;}
    void setWidgetTwo(WidgetTwo one){_widgetTwo = one;}            
}

class WidgetOne {
    Mediator me
    void WidgetOne(Mediator me){
        this.me = me
        me.setWidgetOne(this);
    }
}

class WidgetTwo {
    Mediator me
    void WidgetTwo(Mediator me){
        this.me = me
        me.setWidgetTwo(this);
    }
}

Mediator me = new Mediator();
WidgetOne one = new WidgetOne(me);
WidgetTwo two = new WidgetTwo(me);

Конечно, если больше ничего не нужно знать о виджетах, то я бы избавился от сеттеров и просто получил:

class Mediator {    
    WidgetOne _widgetOne;
    WidgetTwo _widgetTwo;   

     void Mediator(){
        _widgetOne = new WidgetOne(this);
        _widgetTwo = new WidgetTwo(this);
     }            
}

class WidgetOne {
    Mediator me
    void WidgetOne(Mediator me){
        this.me = me
    }
}

class WidgetTwo {
    Mediator me
    void WidgetTwo(Mediator me){
        this.me = me
    }
}

Несколько человек вкратце ... краткая форма:

// Factory:

class Mediator {    
    WidgetOne _widgetOne;
    WidgetTwo _widgetTwo;   

     void Mediator(){
        _widgetOne = WidgetFactory.getW1(this);
        _widgetTwo = WidgetFactory.getW2(this);
     }            
}

class W1 {
    Mediator me
    void W1(){
    }
    void setMediator(Mediator med){me = med}
}

class WidgetFactory {
    W1 getW1(Mediator me){ W1 w = new W1(); w.setMediator(me); return me}
}


// Centralized "model" (variant of factory)
class Mediator {
   W1 w1;

   static Mediator getInstance(){ return inst; }// See Singleton

   void registerW1(W1 w){w1 = w; w.setMediator(this);}
}
2 голосов
/ 21 июня 2011

Вы не указали язык, поэтому я буду сохранять его как можно более общим.

abstract class Participant {
    public string Notify(string message);
}

class WidgetOne  extends Participant {       
    Mediator _mediator;
    public WidgetOne(Mediator theMediator){
        _mediator = theMediator;
    }
    public string Notify(string message){
       #do whatever
    }
    public string Talk(string message){
       return _mediator.Talk(message, this);
    }
} 

class WidgetTwo extends Participant  {       
    Mediator _mediator;
    public WidgetOne(Mediator theMediator){
        _mediator = theMediator;
    }
    public string Notify(string message){
       #do whatever
    }
    public string Talk(string message){
       return _mediator.Talk(message, this);
    }
}

class Mediator {    
    WidgetOne _widgetOne;
    WidgetTwo _widgetTwo;
    public void setWidgetOne(WidgetOne theWidget){
        _wiidgetOne = theWidget;
    }
    public void setWidgetTwo(WidgetTwo theWidget){
        _wiidgetTwo = theWidget;
    }
    public string Talk(string message, Participant p){
           #make sure you do the correct ==/equals/etc.
          if(p == _widgetOne){
              response = _widgetTwo.Notify(message);    
          }else if (p == _widgetTwo){
               response  = _widgetOne.Notify(message);
          }
          return response;
    }

}

class Main {
    public void run(){
       Mediator theMediator = new Mediator();
       WidgetOne  one = new WidgetOne(theMediator);
       WidgetTwo  two = new WidgetTwo(theMediator);
       theMediator.setWidgetOne(one);
       theMediator.setWidgetTwo(two);
       one.Talk("hi there");
    }
}

Итак, на высоком уровне у вас есть 2 участника, которые хотят общаться, поэтому вам нужно настроить общий интерфейс для этого.

  1. Создаем вызов метода Notify (message); это в основном ваш канал связи.

  2. Чтобы все настроить, мы создаем экземпляр посредника, а затем создаем экземпляр обоих участников, передавая им посредника.

  3. Последний шаг установки, это ввести / установить участников медиаторов. В нашем случае мы просто используем простые сеттеры.

  4. Когда приходит время общаться, каждый участник просто вызывает посредника, передает сообщение и self в качестве параметра.

  5. Посредник видит, кто связался с ними, а затем вызывает противоположное.

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы, очевидно, существует множество вариаций этого паттерна, поэтому дайте мне знать, если есть что-то еще, что вы хотели бы увидеть.

Берегите себя.

...