Facciamo un esempio: considera che vuoi creare due applicazioni:
- Applicazione di chat.
- Applicazione operatore ambulanza di emergenza.
mediatore
Costruendo l'applicazione di chat sceglierai il mediator
modello di progettazione.
- Le persone possono entrare e uscire dalla chat in un dato momento, quindi non ha alcun senso mantenere un riferimento diretto tra due persone che chattano.
- Dobbiamo ancora facilitare una comunicazione tra due persone e consentire loro di fare una chat.
Perché preferiremo il mediator
? dai un'occhiata alla sua definizione:
Con il modello mediatore, la comunicazione tra gli oggetti è incapsulata all'interno di un oggetto mediatore. Gli oggetti non comunicano più direttamente tra loro, ma comunicano invece attraverso il mediatore. Ciò riduce le dipendenze tra gli oggetti in comunicazione, riducendo così l'accoppiamento.
Come funziona la magia? Per prima cosa creeremo il mediatore di chat e faremo in modo che gli oggetti delle persone si registrino ad esso, quindi avrà due connessioni direzionali con ogni singola persona (la persona può inviare un messaggio usando il mediatore di chat perché ha accesso ad esso, e il mediatore di chat accederà il metodo ricevuto dall'oggetto persona perché anche lui ha accesso ad esso)
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);
osservatore
Costruendo l'applicazione di chiamata 911 sceglierai il observer
modello di progettazione.
- Ogni
observer
oggetto ambulanza desidera essere informato quando c'è uno stato di emergenza, in modo che possa guidare l'indirizzo e dare aiuto.
- L'operatore del pronto soccorso
observable
tiene il riferimento a ciascuno dell'ambulanza observers
e lo avvisa quando è necessario aiuto (o evento generatore).
Perché preferiremo il observer
? dai un'occhiata alla sua definizione:
Un oggetto, chiamato soggetto, mantiene un elenco dei suoi dipendenti, chiamati osservatori, e li notifica automaticamente di qualsiasi cambiamento di stato, di solito chiamando uno dei loro metodi.
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);
Le differenze:
- La chat
mediator
ha una comunicazione bidirezionale tra gli oggetti delle persone (invio e ricezione) mentre l'operatore observable
ha una comunicazione unidirezionale (dice all'ambulanza observer
di guidare e finire).
- La chat
mediator
può far interagire le persone oggetti tra loro (anche se non è una comunicazione diretta), le ambulanze observers
si registrano solo agli observable
eventi dell'operatore .
- Ogni oggetto persona ha un riferimento alla chat
mediator
, e anche la chat mediator
mantiene il riferimento a ciascuna delle persone. Se l'ambulanza observer
non tiene il riferimento all'operatore observable
, solo l'operatore observable
mantiene il riferimento a ogni ambulanza observer
.
Programmers.StackExchange
stata respinta, ma ho scritto un post simile perché ero interessato alla risposta. Potresti trovare interessanti alcune delle risposte. :)