Mari kita lihat sebuah contoh: anggap Anda ingin membangun dua aplikasi:
- Aplikasi obrolan.
- Aplikasi operator ambulans darurat.
penengah
Membangun aplikasi obrolan Anda akan memilih mediator
pola desain.
- Orang tersebut dapat bergabung dan keluar dari obrolan pada waktu tertentu, jadi tidak masuk akal untuk menyimpan referensi langsung antara dua orang yang mengobrol.
- Kami masih perlu memfasilitasi komunikasi antara dua orang dan memungkinkan mereka mengobrol.
Mengapa kami lebih memilih mediator
? lihat saja definisinya:
Dengan pola mediator, komunikasi antar objek dikemas dalam objek mediator. Objek tidak lagi berkomunikasi secara langsung satu sama lain, tetapi berkomunikasi melalui mediator. Ini mengurangi ketergantungan antara objek yang berkomunikasi, sehingga mengurangi kopling.
Bagaimana keajaiban itu bekerja? Pertama kita akan membuat mediator obrolan dan membuat objek orang mendaftar, sehingga akan memiliki dua koneksi arah dengan setiap orang (orang tersebut dapat mengirim pesan menggunakan mediator obrolan karena memiliki akses ke sana, dan mediator obrolan akan mengakses metode yang diterima dari objek orang karena dia juga memiliki akses ke sana)
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);
pengamat
Membangun aplikasi panggilan 911 Anda akan memilih observer
pola desain.
- Setiap
observer
objek ambulans ingin diberi tahu ketika ada keadaan darurat, sehingga dia dapat mengarahkan alamat dan memberikan bantuan.
- Operator darurat
observable
menjaga referensi ke masing-masing ambulans observers
dan memberi tahu mereka saat bantuan diperlukan (atau menimbulkan peristiwa).
Mengapa kami lebih memilih observer
? lihat saja definisinya:
Sebuah objek, disebut subjek, menyimpan daftar tanggungannya, yang disebut pengamat, dan memberi tahu mereka secara otomatis jika ada perubahan status, biasanya dengan memanggil salah satu metode mereka.
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);
Perbedaan:
- Obrolan
mediator
memiliki komunikasi dua arah antara objek orang (kirim dan terima) di mana operator observable
hanya memiliki komunikasi satu arah (Ini memberi tahu ambulans observer
untuk mengemudi dan menyelesaikannya).
- Obrolan
mediator
dapat membuat objek orang berinteraksi di antara mereka (bahkan jika itu bukan komunikasi langsung), ambulans observers
hanya mendaftar ke observable
acara operator .
- Setiap objek orang memiliki referensi ke obrolan
mediator
, dan obrolan mediator
tetap mengacu pada setiap orang. Jika ambulans observer
tidak mengacu pada operator observable
, hanya operator yang observable
menyimpan referensi ke setiap ambulans observer
.
Programmers.StackExchange
ditolak, tetapi saya membuat posting serupa di sana karena saya tertarik dengan jawabannya. Anda mungkin menemukan beberapa jawaban yang menarik. :)