Образец посредника и создание
У меня есть несколько "виджетов", участвующих в презентации, которые должны взаимодействовать друг с другом, но взаимодействия стали достаточно сложными, чтобы гарантировать новый объект для обработки взаимодействий.
Пытаясь работать через посредника в качестве этого объекта, я путаюсь в том, как эффективно сконструировать участников. Медиатор должен знать о виджетах, а виджеты должны знать о медиаторе.Используя классы игрушек ниже, может кто-нибудь показать мне, как конструкторы будут выглядеть и в каком порядке они обычно создаются?
Ура,
Беррил
class WidgetOne {
Mediator _mediator;
}
class WidgetTwo {
Mediator _mediator;
}
class Mediator {
WidgetOne _widgetOne;
WidgetTwo _widgetTwo;
}
2 ответа:
Это действительно зависит от ряда других обстоятельств, но я бы, вероятно, сделал это:
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);} }
Вы не указали язык, поэтому я сохраню его как можно более общим.
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 участника, которые хотят поговорить, поэтому вам нужно настроить общий интерфейс для этого.
Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы, есть, очевидно, многочисленные вариации этого шаблона, так что дайте мне знать, если есть что-то еще, что вы хотели бы увидеть.
Мы создаем метод вызова Notify (сообщение); это в основном ваш канал связи.
Чтобы настроить вещи, мы создаем экземпляр посредника, а затем создаем экземпляр обоих участников, передавая им посредник.
Последний шаг insetup, состоит в том, чтобы ввести / установить медиаторов участников. В нашем случае мы просто используем простые сеттеры.
Когда приходит время общения, каждый участник просто вызывает медиатора, передает сообщение и себя в качестве параметра.
Посредник видит, кто с ними связался, а потом звонит противоположному.
Берегите себя.