Mediator vs Pengamat?

27

Dapatkah seseorang memberi saya jawaban kanonik tentang perbedaan antara a Observerdan a Mediator, dan ringkasan kapan Anda harus menggunakan satu pola di atas yang lain?

Saya tidak yakin tentang situasi seperti apa yang akan membutuhkan Observerdan apa yang akan membutuhkanMediator

Rachel
sumber
Saya ingin tahu ide Anda sendiri tentang ini setelah 7 tahun?
Niing

Jawaban:

19

Dalam buku asli yang menciptakan istilah Pengamat dan Mediator, Pola Desain, Elemen Perangkat Lunak Berorientasi Objek Reusable itu mengatakan bahwa pola Mediator dapat diimplementasikan dengan menggunakan pola pengamat. Namun itu juga dapat diimplementasikan dengan memiliki Kolega (kira-kira setara dengan Subjek dari pola Pengamat) memiliki referensi ke kelas Mediator atau antarmuka Mediator.

Ada banyak kasus ketika Anda ingin menggunakan pola pengamat, kuncinya adalah bahwa pada objek tidak boleh tahu apa objek lain yang mengamati keadaan itu.

Mediator sedikit lebih spesifik, ia menghindari membuat kelas berkomunikasi secara langsung tetapi melalui mediator. Ini membantu prinsip Tanggung Jawab Tunggal dengan memungkinkan komunikasi diturunkan ke kelas yang hanya menangani itu.

Contoh Mediator klasik adalah dalam GUI, di mana pendekatan naif dapat mengarah ke kode pada acara klik tombol yang mengatakan "jika panel Foo dinonaktifkan dan panel Bar memiliki label yang mengatakan" Silakan masukkan tanggal "maka jangan panggil server, jika tidak, silakan, "di mana dengan pola Mediator itu bisa mengatakan" Saya hanya sebuah tombol dan tidak memiliki urusan duniawi mengetahui tentang panel Foo dan label pada panel Bar, jadi saya hanya akan bertanya kepada mediator saya jika memanggil server tidak apa-apa sekarang. "

Atau, jika diterapkan menggunakan pola pengamat tombol akan berkata "Hei, pengamat (yang akan mencakup mediator), negara saya berubah (seseorang mengklik saya). Lakukan sesuatu tentang hal itu jika Anda peduli". Dalam contoh saya yang mungkin kurang masuk akal, tetapi kadang-kadang itu akan terjadi, dan perbedaan antara Pengamat dan Mediator akan lebih merupakan niat daripada perbedaan dalam kode itu sendiri.

psr
sumber
Terima kasih, contoh Anda sangat membantu memperjelas perbedaan antara keduanya untuk saya. Jika saya mengerti Anda dengan benar, pola pengamat menggunakan sistem berlangganan / siaran pesan untuk komunikasi, sementara mediator seperti entitas yang dapat diakses secara global yang objeknya dapat meminta informasi.
Rachel
@ Rachel - Saya akan menggambarkan pengamat seperti yang Anda lakukan. Mediator mungkin tidak mendunia, tetapi diketahui semua objek di set yang akan berkomunikasi satu sama lain tetapi sekarang melalui mediator. Kecuali mediator diimplementasikan sebagai pengamat, dalam hal ini ia tahu tentang semua objek tersebut (setidaknya melalui antarmuka yang dapat diamati, mungkin secara langsung) tetapi mereka tidak tahu tentang itu.
psr
9

Pola Pengamat bekerja dengan baik ketika tidak ada koordinasi antara pengamat diperlukan dan hubungan mengamati berjalan satu arah.

Sebagai contoh, biarkan objek B dan C mengamati objek A. Ketika objek A menembakkan peristiwa X, maka objek B harus menjalankan metode Y () dan objek C harus menjalankan metode Z (). Jika metode BY () dan CZ () benar-benar independen dan tidak memerlukan koordinasi, lanjutkan dan gunakan pola pengamat.

Di sisi lain, jika BY () harus dijalankan sebelum CZ () maka Anda akan ingin menggunakan pola Mediator di mana mediator merangkum koordinasi ini. Dalam skenario ini, mediator M akan mengamati objek A dan akan memiliki referensi ke objek B dan C. Ketika A menyalakan event X, M akan menangani event dan memanggil BY () dan CZ () dalam urutan yang ditentukan.

Juga, jika objek A, B dan C perlu mengamati satu sama lain maka menggunakan mediator sebagai perantara akan jauh untuk memisahkan objek-objek ini dan menghindari kode spageti.

Raymond Saltrelli
sumber
5

The ObserverPola digunakan ketika tindakan yang diambil di satu kelas (kelas yang diamati) perlu untuk menghasilkan reaksi di kelas lain (kelas mengamati) tetapi tidak diinginkan untuk kelas diamati akan digabungkan ke kelas mengamati. Ini adalah pola yang sangat umum. Parser XML SAX mungkin merupakan contoh yang baik. Untuk menggunakan parser SAX, klien mengimplementasikan ContentHandlerantarmuka untuk "mengamati" operasi parser. Ketika parser menemukan elemen dokumen XML, ia memanggil metode ContentHandler. Pengurai dapat menjalankan kode klien, tetapi pengurai tidak digabungkan ke kode klien.

The MediatorPola merupakan enkapsulasi pola penggunaan satu set objek. Kode klien hanya digabungkan ke mediator, alih-alih digabungkan ke beberapa kelas lainnya. Ini mirip dengan agregasi, kecuali masa objek yang dienkapsulasi tidak tergantung pada masa mediator.

kevin cline
sumber
1

Secara sederhana (yang saya gunakan untuk mengingatnya):

Pengamat: Gunakan ketika satu objek ingin diberitahu tentang perubahan keadaan di negara lain (secara tegas, menggunakan peristiwa adalah Pengamat)

Untuk memahami mediator, saya merasa lebih mudah ketika Anda mempertimbangkan Fasad terlebih dahulu: Fasad mengagregasi fungsionalitas kelas yang terpisah (kadang-kadang seluruh subsistem) dan menyediakan fungsionalitas itu dalam satu antarmuka.

Mediator: Sama seperti Fasad, kecuali bahwa ia menggabungkan fungsionalitas semua kelas agregat untuk menghasilkan fungsionalitas baru . (Penjelasan bagus di sini )

Steven Evers
sumber