Weźmy przykład: rozważmy, że chcesz zbudować dwie aplikacje:
- Aplikacja do czatu.
- Aplikacja operatora karetki pogotowia ratunkowego.
mediator
Budując aplikację do czatu, wybierzesz mediator
wzorzec projektowy.
- Osoby mogą dołączać do czatu i opuszczać go w dowolnym momencie, więc nie ma sensu utrzymywanie bezpośredniego odniesienia między dwiema rozmawiającymi osobami.
- Nadal musimy ułatwić komunikację między dwiema osobami i pozwolić im na rozmowę.
Dlaczego wolimy mediator
? wystarczy spojrzeć na jego definicję:
W przypadku wzorca mediatora komunikacja między obiektami jest zamknięta w obiekcie mediatora. Obiekty nie komunikują się już bezpośrednio ze sobą, ale zamiast tego komunikują się przez mediatora. Zmniejsza to zależności między komunikującymi się obiektami, zmniejszając w ten sposób sprzężenie.
Jak działa magia? Najpierw stworzymy mediatora czatu i sprawimy, że obiekty osób będą się do niego rejestrować, aby miał dwukierunkowe połączenie z każdą osobą (osoba może wysłać wiadomość za pomocą mediatora czatu, ponieważ ma do niej dostęp, a mediator czatu będzie miał do niej dostęp otrzymana metoda przedmiotu osoby, ponieważ on również ma do niej dostęp)
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);
obserwator
Budując aplikację wzywania 911, będziesz wybierać observer
wzorzec projektowy.
- Każdy
observer
obiekt karetki chce być informowany o sytuacji awaryjnej, aby mógł podjechać pod adres i udzielić pomocy.
- Operator ratunkowy
observable
utrzymuje łączność z każdym w karetce observers
i powiadamia ich, gdy potrzebna jest pomoc (lub zdarzenie generujące).
Dlaczego wolimy observer
? wystarczy spojrzeć na jego definicję:
Obiekt, zwany podmiotem, przechowuje listę swoich elementów zależnych, zwanych obserwatorami, i powiadamia ich automatycznie o wszelkich zmianach stanu, zwykle przez wywołanie jednej z ich metod.
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);
Różnice:
- Czat
mediator
ma dwukierunkową komunikację między obiektami osób (wysyłanie i odbieranie), podczas gdy operator observable
ma tylko jednokierunkową komunikację (nakazuje karetce observer
jechać i kończyć).
- Czat
mediator
może sprawić, że obiekty osób wchodzą w interakcję (nawet jeśli nie jest to komunikacja bezpośrednia), karetki observers
rejestrują tylko observable
zdarzenia operatora .
- Każdy obiekt osoby ma odniesienie do czatu
mediator
, a także czat mediator
zachowuje odniesienie do każdej z osób. Gdzie karetka observer
nie ma odniesienia do operatora observable
, tylko operator observable
ma odniesienie do każdej karetki observer
.
Programmers.StackExchange
została odrzucona, ale zamieściłem tam podobny post , ponieważ byłem zainteresowany odpowiedzią. Niektóre odpowiedzi mogą być interesujące. :)