Saya telah membaca Gang Of Four , untuk memecahkan beberapa masalah saya dan menemukan pola Mediator .
Saya sebelumnya menggunakan Observer dalam proyek saya untuk membuat beberapa aplikasi GUI. Saya agak bingung karena saya tidak menemukan perbedaan besar di antara keduanya. Saya menjelajahi untuk menemukan perbedaannya tetapi tidak dapat menemukan jawaban yang tepat untuk pertanyaan saya.
Bisakah seseorang membantu saya membedakan keduanya dengan beberapa contoh bagus yang dengan jelas membatasi keduanya?
Programmers.StackExchange
ditolak, tetapi saya membuat posting serupa di sana karena saya tertarik dengan jawabannya. Anda mungkin menemukan beberapa jawaban yang menarik. :)ChangeManager
untukObserver
pola yang digunakanMediator
. Lihat; paginas.fe.up.pt/~aaguiar/as/gof/hires/pat5g.htm#samplecodeJawaban:
Pola Observer: Mendefinisikan ketergantungan satu-ke-banyak antar objek sehingga ketika satu objek berubah status, semua tanggungannya diberitahu dan diperbarui secara otomatis.
Pola Mediator: Mendefinisikan sebuah objek yang merangkum bagaimana sekumpulan objek berinteraksi. Mediator mempromosikan kopling longgar dengan menjaga objek agar tidak merujuk satu sama lain secara eksplisit, dan ini memungkinkan Anda memvariasikan interaksinya secara independen.
Sumber: dofactory
Contoh:
Pola pengamat: Kelas A, dapat memiliki nol atau lebih pengamat tipe O yang terdaftar dengannya. Ketika sesuatu di A diubah, itu memberitahu semua pengamat.
Pola mediator: Anda memiliki sejumlah contoh kelas X (atau mungkin bahkan beberapa tipe berbeda: X, Y & Z), dan mereka ingin berkomunikasi satu sama lain (tetapi Anda tidak ingin masing-masing memiliki referensi eksplisit untuk masing-masing other), jadi Anda membuat kelas mediator M. Setiap instance X memiliki referensi ke instance bersama dari M, yang melaluinya dapat berkomunikasi dengan instance X lainnya (atau X, Y, dan Z).
sumber
Dalam buku aslinya yang mencetuskan istilah Observer and Mediator, Design Patterns, Elements of Reusable Object-Oriented Software , disebutkan bahwa pola Mediator dapat diimplementasikan dengan menggunakan pola observer. Namun ini juga dapat diterapkan dengan memiliki Rekan (yang kira-kira setara dengan pola Subjek Pengamat) memiliki referensi ke kelas Mediator atau antarmuka Mediator.
Ada banyak kasus ketika Anda ingin menggunakan pola pengamat, kuncinya adalah bahwa suatu objek tidak boleh tahu apa objek lain yang mengamati statusnya.
Mediator sedikit lebih spesifik, ia menghindari kelas berkomunikasi secara langsung tetapi melalui mediator. Ini membantu prinsip Tanggung Jawab Tunggal dengan memungkinkan komunikasi diturunkan ke kelas yang hanya menangani komunikasi.
Contoh Mediator klasik ada di GUI, di mana pendekatan naif mungkin mengarah ke kode pada peristiwa klik tombol yang mengatakan "jika panel Foo dinonaktifkan dan panel Bar memiliki label yang mengatakan" Harap masukkan tanggal "maka jangan panggil server, jika tidak lanjutkan ", di mana dengan pola Mediator dapat dikatakan" 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 menelepon server tidak apa-apa sekarang. "
Atau, jika Mediator diimplementasikan menggunakan pola Observer, tombolnya akan berkata "Hai, pengamat (yang akan menyertakan mediator), status saya berubah (seseorang mengklik saya). Lakukan sesuatu jika Anda peduli". Dalam contoh saya yang mungkin kurang masuk akal daripada merujuk langsung ke mediator, tetapi dalam banyak kasus menggunakan pola Observer untuk mengimplementasikan Mediator akan masuk akal, dan perbedaan antara Observer dan Mediator akan lebih pada maksud daripada perbedaan dalam kode itu sendiri.
sumber
Pengamat
1. Tanpa
Klien1 : Hai Subjek , kapan Anda berubah?
Klien2 : Kapan Anda mengubah Subjek ? Saya belum memperhatikan!
Klien3 : Saya tahu bahwa Subjek telah berubah.
2. Dengan
Penengah
1. Tanpa
2. Dengan
sumber
Pola ini digunakan dalam situasi yang berbeda:
Pola mediator digunakan ketika Anda memiliki dua sub-sistem dengan beberapa ketergantungan dan salah satunya akan berubah, dan karena Anda mungkin tidak ingin mengubah sistem yang bergantung pada yang lain, Anda mungkin ingin memperkenalkan mediator yang akan pisahkan ketergantungan di antara mereka. Dengan begitu, ketika salah satu sub-sistem berubah, yang harus Anda lakukan hanyalah memperbarui mediator.
Pola pengamat digunakan ketika sebuah kelas ingin mengizinkan kelas lain untuk mendaftarkan dirinya sendiri dan menerima pemberitahuan atas kejadian, misalnya ButtonListener dll.
Kedua pola ini memungkinkan kopling yang lebih rendah, tetapi sangat berbeda.
sumber
Mari kita lihat sebuah contoh: anggap Anda ingin membangun dua aplikasi:
penengah
Membangun aplikasi obrolan Anda akan memilih
mediator
pola desain.Mengapa kami lebih memilih
mediator
? lihat saja definisinya: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)
pengamat
Membangun aplikasi panggilan 911 Anda akan memilih
observer
pola desain.observer
objek ambulans ingin diberi tahu ketika ada keadaan darurat, sehingga dia dapat mengarahkan alamat dan memberikan bantuan.observable
menjaga referensi ke masing-masing ambulansobservers
dan memberi tahu mereka saat bantuan diperlukan (atau menimbulkan peristiwa).Mengapa kami lebih memilih
observer
? lihat saja definisinya:Perbedaan:
mediator
memiliki komunikasi dua arah antara objek orang (kirim dan terima) di mana operatorobservable
hanya memiliki komunikasi satu arah (Ini memberi tahu ambulansobserver
untuk mengemudi dan menyelesaikannya).mediator
dapat membuat objek orang berinteraksi di antara mereka (bahkan jika itu bukan komunikasi langsung), ambulansobservers
hanya mendaftar keobservable
acara operator .mediator
, dan obrolanmediator
tetap mengacu pada setiap orang. Jika ambulansobserver
tidak mengacu pada operatorobservable
, hanya operator yangobservable
menyimpan referensi ke setiap ambulansobserver
.sumber
Meskipun keduanya digunakan untuk cara terorganisir menceritakan tentang perubahan negara, mereka sedikit berbeda secara struktural dan semantik IMO.
Observer digunakan untuk menyiarkan perubahan status suatu objek tertentu, dari objek itu sendiri. Jadi perubahan terjadi di objek pusat yang juga bertanggung jawab untuk memberi isyarat itu. Namun, di Mediator, perubahan status dapat terjadi di objek apa pun, tetapi disiarkan dari mediator. Jadi ada perbedaan aliran. Tapi, menurut saya ini tidak memengaruhi perilaku kode kita. Kita dapat menggunakan satu atau lainnya untuk mencapai perilaku yang sama. Di sisi lain, perbedaan ini mungkin memiliki beberapa pengaruh pada pemahaman konseptual kode.
Lihat, tujuan utama menggunakan pola adalah untuk menciptakan bahasa yang sama di antara para pengembang. Jadi, ketika saya melihat seorang mediator, saya secara pribadi memahami banyak elemen yang mencoba berkomunikasi melalui satu broker / hub untuk mengurangi kebisingan komunikasi (atau untuk mempromosikan SRP) dan setiap objek sama pentingnya dalam hal memiliki kemampuan untuk memberi sinyal perubahan keadaan. Misalnya, pikirkan beberapa pesawat yang mendekati bandara. Masing-masing harus berkomunikasi melalui tiang (mediator) daripada berkomunikasi satu sama lain. (Bayangkan 1000 pesawat berkomunikasi satu sama lain saat mendarat - itu akan berantakan)
Namun, ketika saya melihat pengamat, itu berarti ada beberapa perubahan status yang mungkin saya pedulikan dan harus mendaftar / berlangganan untuk mendengarkan perubahan status tertentu. Ada objek pusat yang bertanggung jawab untuk memberi sinyal perubahan status. Misalnya, jika saya peduli dengan bandara tertentu dalam perjalanan dari A ke B, saya dapat mendaftar ke bandara tersebut untuk menonton beberapa acara yang disiarkan seperti jika ada landasan pacu kosong atau semacamnya.
Semoga sudah jelas.
sumber
@cdc menjelaskan perbedaan maksud dengan sangat baik.
Saya akan menambahkan beberapa info lebih lanjut di atasnya.
Observer : Mengaktifkan pemberitahuan suatu peristiwa dalam satu objek ke kumpulan objek yang berbeda (contoh kelas yang berbeda)
Mediator : Memusatkan komunikasi antara kumpulan objek, yang dibuat dari kelas tertentu.
Struktur pola Mediator dari pabrik pengolahan :
Mediator : Mendefinisikan antarmuka untuk komunikasi antar Rekan.
Rekan : Adalah kelas abstrak, yang mendefinisikan acara yang akan dikomunikasikan antar Rekan
ConcreteMediator : Menerapkan perilaku kooperatif dengan mengoordinasikan objek Rekan dan mempertahankan rekannya
ConcreteColleague : Menerapkan operasi notifikasi yang diterima melalui Mediator , yang dibuat oleh Rekan lainnya
Satu contoh dunia nyata:
Anda memelihara jaringan komputer dalam topologi Mesh . Jika komputer baru ditambahkan atau komputer yang sudah ada dihapus, semua komputer lain di jaringan itu harus mengetahui tentang dua peristiwa ini.
Mari kita lihat bagaimana pola Mediator cocok dengannya.
Potongan kode:
keluaran:
Penjelasan:
sumber
Bagaimana dengan penjelasan ini Secara teknis baik Observer dan Mediator adalah sama dan digunakan untuk menyediakan cara yang terpisah untuk komunikasi komponen, tetapi penggunaannya berbeda.
Saat
obeserver
memberi tahu komponen yang dilanggan tentang perubahan status (pembuatan data db baru, misalnya),mediator
perintah komponen terdaftar untuk melakukan sesuatu yang berkaitan dengan alur logika bisnis (mengirim email ke pengguna untuk menyetel ulang kata sandi).Pengamat
Penengah
sumber