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 mediatormodello 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 observermodello di progettazione.
- Ogni
observeroggetto 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
observabletiene il riferimento a ciascuno dell'ambulanza observerse 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
mediatorha una comunicazione bidirezionale tra gli oggetti delle persone (invio e ricezione) mentre l'operatore observableha una comunicazione unidirezionale (dice all'ambulanza observerdi guidare e finire).
- La chat
mediatorpuò far interagire le persone oggetti tra loro (anche se non è una comunicazione diretta), le ambulanze observerssi registrano solo agli observableeventi dell'operatore .
- Ogni oggetto persona ha un riferimento alla chat
mediator, e anche la chat mediatormantiene il riferimento a ciascuna delle persone. Se l'ambulanza observernon tiene il riferimento all'operatore observable, solo l'operatore observablemantiene il riferimento a ogni ambulanza observer.
Programmers.StackExchangestata respinta, ma ho scritto un post simile perché ero interessato alla risposta. Potresti trovare interessanti alcune delle risposte. :)