Dapatkah seseorang memberi saya jawaban kanonik tentang perbedaan antara a Observer
dan a Mediator
, dan ringkasan kapan Anda harus menggunakan satu pola di atas yang lain?
Saya tidak yakin tentang situasi seperti apa yang akan membutuhkan Observer
dan apa yang akan membutuhkanMediator
design-patterns
Rachel
sumber
sumber
Jawaban:
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.
sumber
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.
sumber
The
Observer
Pola 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 mengimplementasikanContentHandler
antarmuka untuk "mengamati" operasi parser. Ketika parser menemukan elemen dokumen XML, ia memanggil metodeContentHandler
. Pengurai dapat menjalankan kode klien, tetapi pengurai tidak digabungkan ke kode klien.The
Mediator
Pola 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.sumber
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 )
sumber