Давайте рассмотрим пример: представьте, что вы хотите создать два приложения:
- Приложение для чата.
- Приложение оператора скорой помощи.
посредник
Создавая приложение для чата, вы будете выбирать 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);
наблюдатель
Создавая приложение для вызова службы экстренной помощи, вы будете выбирать 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
.
Programmers.StackExchange
была отклонена, но я сделал похожий пост, потому что меня интересовал ответ. Вы можете найти некоторые ответы интересными. :)