Design patterns
Посредник
Поиск…
Пример шаблона медиатора в java
Шаблон медиатора определяет объект (посредник), который инкапсулирует, как взаимодействует набор объектов. Он обеспечивает связь «многие-ко-многим».
Диаграмма UML:
Ключевые компоненты:
Mediator:
Определяет интерфейс для общения между коллегами.
Colleague
: Является абстрактным классом, который определяет события, которые будут переданы между коллегами
ConcreteMediator
: реализует совместное поведение, координируя объекты Colleague
и поддерживая своих коллег
ConcreteColleague
: выполняет операции уведомления, полученные через Mediator
, который был сгенерирован другим Colleague
Один пример в реальном мире:
Вы поддерживаете сеть компьютеров в топологии Mesh
.
Ячеистая сеть представляет собой топологию сети, в которой каждый узел передает данные для сети. Все узлы сетки взаимодействуют в распределении данных в сети.
Если новый компьютер добавлен или существующий компьютер удален, все остальные компьютеры в этой сети должны знать об этих двух событиях.
Посмотрим, как в него вписывается шаблон Медиатора.
Фрагмент кода:
import java.util.List;
import java.util.ArrayList;
/* Define the contract for communication between Colleagues.
Implementation is left to ConcreteMediator */
interface Mediator{
void register(Colleague colleague);
void unregister(Colleague colleague);
}
/* Define the contract for notification events from Mediator.
Implementation is left to ConcreteColleague
*/
abstract class Colleague{
private Mediator mediator;
private String name;
public Colleague(Mediator mediator,String name){
this.mediator = mediator;
this.name = name;
}
public String toString(){
return name;
}
public abstract void receiveRegisterNotification(Colleague colleague);
public abstract void receiveUnRegisterNotification(Colleague colleague);
}
/* Process notification event raised by other Colleague through Mediator.
*/
class ComputerColleague extends Colleague {
private Mediator mediator;
public ComputerColleague(Mediator mediator,String name){
super(mediator,name);
}
public void receiveRegisterNotification(Colleague colleague){
System.out.println("New Computer register event with name:"+colleague+
": received @"+this);
// Send further messages to this new Colleague from now onwards
}
public void receiveUnRegisterNotification(Colleague colleague){
System.out.println("Computer left unregister event with name:"+colleague+
":received @"+this);
// Do not send further messages to this Colleague from now onwards
}
}
/* Act as a central hub for communication between different Colleagues.
Notifies all Concrete Colleagues on occurrence of an event
*/
class NetworkMediator implements Mediator{
List<Colleague> colleagues = new ArrayList<Colleague>();
public NetworkMediator(){
}
public void register(Colleague colleague){
colleagues.add(colleague);
for (Colleague other : colleagues){
if ( other != colleague){
other.receiveRegisterNotification(colleague);
}
}
}
public void unregister(Colleague colleague){
colleagues.remove(colleague);
for (Colleague other : colleagues){
other.receiveUnRegisterNotification(colleague);
}
}
}
public class MediatorPatternDemo{
public static void main(String args[]){
Mediator mediator = new NetworkMediator();
ComputerColleague colleague1 = new ComputerColleague(mediator,"Eagle");
ComputerColleague colleague2 = new ComputerColleague(mediator,"Ostrich");
ComputerColleague colleague3 = new ComputerColleague(mediator,"Penguin");
mediator.register(colleague1);
mediator.register(colleague2);
mediator.register(colleague3);
mediator.unregister(colleague1);
}
}
выход:
New Computer register event with name:Ostrich: received @Eagle
New Computer register event with name:Penguin: received @Eagle
New Computer register event with name:Penguin: received @Ostrich
Computer left unregister event with name:Eagle:received @Ostrich
Computer left unregister event with name:Eagle:received @Penguin
Объяснение:
-
Eagle
сначала добавляется в сеть через событие register. Никаких уведомлений другим коллегам, так как Eagle является первым. - Когда
Ostrich
добавляется в сеть,Eagle
уведомляется: теперь отображается строка 1 вывода. - Когда
Penguin
добавляется в сеть, обаEagle
иOstrich
были уведомлены: теперь отображаются строка 2 и строка 3. - Когда
Eagle
покинул сеть через незарегистрированное событие, обаOstrich
иPenguin
были уведомлены. Теперь отображаются строка 4 и строка 5 вывода.