Розглянемо приклад: розглянемо, що ви хочете створити два додатки:
- Застосування чату.
- Додаток оператора швидкої допомоги.
посередник
Створюючи додаток для чату, ви будете вибирати 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
.
Programmers.StackExchange
було відхилено, але я зробив там подібний допис , оскільки зацікавив відповідь. Деякі відповіді можуть вам здатися цікавими. :)