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