Давайте рассмотрим пример: предположим, что вы хотите создать два приложения:
- Приложение чата.
- Приложение оператора скорой помощи.
Посредник
При создании приложения чата вы будете выбирать шаблон проектирования mediator
.
- Лица могут присоединяться и выходить из чата в любой момент времени, поэтому нет смысла сохранять прямую ссылку между двумя людьми в чате.
- Нам по-прежнему необходимо облегчить общение между двумя людьми и позволить им поговорить.
Почему мы предпочитаем mediator
? просто взгляните на его определение:
При использовании шаблона-посредника связь между объектами
инкапсулирован в объекте-посреднике. Объекты больше не общаются
непосредственно друг с другом, но вместо этого общаться через
посредник. Это уменьшает зависимости между взаимодействующими объектами,
тем самым уменьшая сцепление.
Как работает магия? Сначала мы создадим посредник чата и сделаем так, чтобы объекты лиц регистрировались в нем, чтобы у него было двунаправленное соединение с каждым отдельным человеком (человек может отправить сообщение с помощью посредника чата, поскольку у него есть к нему доступ, и посредник чата получит доступ полученный метод объекта человек, потому что он также имеет к нему доступ)
function Person(name) {
let self = this;
this._name = name;
this._chat = null;
this._receive(from, message) {
console.log("{0}: '{1}'".format(from.name(), message));
}
this._send(to, message) {
this._chat.message(this, to, message);
}
return {
receive: (from, message) => { self._receive(from, message) },
send: (to, message) => { self._send(to, message) },
initChat: (chat) => { this._chat = chat; },
name: () => { return this._name; }
}
}
function ChatMediator() {
let self = this;
this._persons = [];
return {
message: function (from, to, message) {
if (self._persons.indexOf(to) > -1) {
self._persons[to].receive(from, message);
}
},
register: function (person) {
person.initChat(self);
self._persons.push(person);
}
unRegister: function (person) {
person.initChat(null);
delete self._persons[person.name()];
}
}
};
//Usage:
let chat = new ChatMediator();
let colton = new Person('Colton');
let ronan = new Person('Ronan');
chat.register(colton);
chat.register(ronan);
colton.send(colton, 'Hello there, nice to meet you');
ronan.send(ronan, 'Nice to meet you to');
colton.send(colton, 'Goodbye!');
chat.unRegister(colton);
наблюдатель
При создании приложения для вызова 911 вы будете выбирать шаблон проектирования observer
.
- Каждый объект скорой помощи
observer
хочет получить информацию о чрезвычайном состоянии, чтобы он мог управлять адресом и помогать.
- Аварийный оператор
observable
хранит ссылку на каждую машину скорой помощи observers
и уведомляет их, когда требуется помощь (или генерируется событие).
Почему мы предпочитаем observer
? просто взгляните на его определение:
Объект, называемый субъектом, ведет список своих зависимых
вызывать наблюдателей и автоматически уведомлять их о любом состоянии
изменения, обычно вызывая один из их методов.
function AmbulanceObserver(name) {
let self = this;
this._name = name;
this._send(address) {
console.log(this._name + ' has been sent to the address: ' + address);
}
return {
send: (address) => { self._send(address) },
name: () => { return this._name; }
}
}
function OperatorObservable() {
let self = this;
this._ambulances = [];
return {
send: function (ambulance, address) {
if (self._ambulances.indexOf(ambulance) > -1) {
self._ambulances[ambulance].send(address);
}
},
register: function (ambulance) {
self._ambulances.push(ambulance);
}
unRegister: function (ambulance) {
delete self._ambulances[ambulance.name()];
}
}
};
//Usage:
let operator = new OperatorObservable();
let amb111 = new AmbulanceObserver('111');
let amb112 = new AmbulanceObserver('112');
operator.register(amb111);
operator.register(amb112);
operator.send(amb111, '27010 La Sierra Lane Austin, MN 000');
operator.unRegister(amb111);
operator.send(amb112, '97011 La Sierra Lane Austin, BN 111');
operator.unRegister(amb112);
Различия:
- В чате
mediator
имеется двухсторонняя связь между объектами лиц (отправка и получение), при этом оператор observable
имеет только одностороннюю связь (он сообщает машине скорой помощи observer
о вождении и завершении).
- Чат
mediator
может заставить людей взаимодействовать между собой (даже если это не прямое общение), машины скорой помощи observers
регистрируются только у оператора observable
событий.
- Каждый объект персонажа имеет ссылку на чат
mediator
, а также в чате mediator
хранится ссылка на каждого из людей. Там, где скорая помощь observer
не сохраняет ссылки на оператора observable
, только оператор observable
сохраняет ссылку на каждую скорую помощь observer
.