Dalam pola delegasi , hanya satu objek yang dapat langsung mendengarkan acara objek lain. Dalam pola pengamat , sejumlah objek dapat mendengarkan acara objek tertentu. Saat merancang kelas yang perlu memberi tahu objek lain tentang peristiwa, mengapa Anda pernah menggunakan pola delegasi di atas pola pengamat? Saya melihat pola pengamat lebih fleksibel. Anda mungkin hanya memiliki satu pengamat sekarang, tetapi desain masa depan mungkin memerlukan banyak pengamat.
9
Jawaban:
Tidak ada pola delegasi per se. Saya akan menganggap Anda maksud Pola Delegasi .
Seperti yang saya pahami, mereka saling membalikkan satu sama lain dan digunakan untuk tujuan yang berbeda.
Secara umum, dengan Pola Pengamat , sejumlah objek pengamat akan mendengarkan suatu peristiwa pada objek kedua dan bertindak pada acara tersebut. Objek kedua tidak memiliki pengetahuan tentang pendengarnya. Itu hanya memanggil mereka.
Objek delegasi diteruskan ke objek kedua yang memanggil metode langsung pada delegasi. Dan di situlah letak keuntungan yang Anda cari. Alih-alih mengirim satu pesan ke beberapa pendengar, ia memiliki kontrol penuh atas satu objek (pada waktu tertentu). Lihat juga Pembalikan Kontrol .
sumber
Anda melihat hal-hal yang salah. Seorang pengamat melihat bahwa peristiwa tertentu terjadi. Itu tidak berdampak, atau memilikinya. Delegasi menangani acara tertentu, dan memiliki kepemilikan atas pawang, bahkan jika delegator memiliki antarmuka ke acara tersebut.
sumber
Itu pertanyaan dari beberapa trade-off.
Pertukaran:
Pola pendelegasian:
Pola pengamat:
sumber
Pola delegasi, seperti yang saya mengerti, diketahui sebagai mekanisme pengendali event dalam bahasa lain, misalnya Delphi. Karena itu, ini hanyalah implementasi dari pola pengamat dengan batasan utama: hanya satu pendengar pada satu waktu.
Kerugian dari penangan acara atau delegasi jelas: hanya satu pengamat.
Keuntungannya tidak begitu jelas: kinerja. Dengan pola pengamat Anda dapat menambahkan banyak pengamat. Ketika suatu peristiwa terjadi bahwa pengamat perlu diberitahu tentang, Anda harus menghitung pengamat dan mengirimkan pemberitahuan kepada masing-masing. Ini dapat dengan cepat merobohkan setiap kejadian yang diamati, terutama ketika jumlah acara yang memerlukan pemberitahuan juga signifikan.
sumber
int (*my_int_f)(int)
dalam C). Saya selalu berpikir mereka akan membuatnya lebih mudah untuk dipahami dengan membuatnya bekerja lebih seperti struct / enum. Suatu acara adalah pengait untuk rangkaian pendengar yang fleksibel, menggunakan tanda tangan delegasi tunggal. Anda dapat melakukannya tanpa suatu kejadian (itulah sebabnya saya menganggap OP maksudnya Pola Delegasi, yang sangat berbeda), tetapi bahasanya membuatnya lebih mudah bagi Anda.Ini adalah posting lama tapi saya akan tetap berpegang pada karena jawaban lain tidak berurusan dengan apa yang terjadi ketika menggunakan kedua pola, mereka tampaknya lebih banyak tentang teori daripada praktik.
Bagaimana Delegasi dan Pengamat Bekerja
Dengan Delegasi, delegator memilih dengan tepat siapa yang akan menanggapi suatu peristiwa tertentu saat sumber peristiwa potensial itu dibuat. Anda bisa menganggap pendengar ini sebagai pengamat tunggal . Dalam kasus pola Observer, pengamat memilih siapa yang diamati kapan pun ia mau; sehingga ketergantungan berubah ketika datang ke pengamat vs delegasi. Dengan pola pengamat, pikirkan koran dan pelanggan sebagai pengamat. Pengamat mengendalikan kapan hubungan itu tercipta. Dengan delegasi pikirkan seorang karyawan dan seorang majikan. Majikan mengendalikan kapan hubungan dibuat dan siapa yang bertanggung jawab atas peristiwa tertentu. Karyawan tidak dapat memilih tugas apa yang sedang mereka kerjakan ... secara umum.
Beberapa delegasi berpendapat dapat memiliki satu pengamat tapi saya pikir perbedaan nyata antara keduanya adalah bagaimana penanganan acara ditugaskan. Anda tidak akan pernah melihat delegasi mendaftar untuk suatu acara. Itu tidak akan pernah tahu bahkan menangani acara sampai itu terjadi dan delegator memanggil metode publik di atasnya.
Keuntungan Delegasi
Pola ini sangat kaku dan dengan sebagian besar desain regid lebih sederhana dan umumnya lebih kuat. Ini memaksa Anda untuk mendeklarasikan handler acara Anda di muka pada saat menginisialisasi sumber acara potensial. Jika Anda membutuhkan seseorang untuk mengarahkan lalu lintas, Anda menugaskan direktur lalu lintas sebelum Anda membuka jalan. Dalam hal pengamat Anda akan membiarkan polisi lalu lintas memilih kapan harus mengarahkan lalu lintas kapan saja dia mau.
Kerugian Delegasi
Kerugian dari desain ini adalah tidak fleksibel. Jika Anda menerapkan beberapa kode untuk berlangganan surat kabar, maka surat kabar / delegator harus mengidentifikasi secara tepat siapa yang dapat membaca cerita-cerita berita begitu mereka dibuat. Dengan pola pengamat, mereka dapat didaftarkan nanti kapan saja dan surat kabar hanya perlu mengetahui bahwa orang baru telah mendaftar.
Kapan Memilih Delegasi?
Ketika Anda membutuhkan satu pengamat tertentu untuk memastikan dan tidak ada alasan bagi Anda untuk mengubah siapa yang mengamati maka desain kaku dari pola pendelegasian akan bermanfaat.
Misalnya, Anda memerlukan kelas / objek untuk menangani pembuatan pop-up untuk kesalahan tertentu. Tidak ada banyak alasan mengapa pada saat run-time Anda perlu beralih siapa yang menangani kesalahan tertentu sehingga mendelegasikan kesalahan "Kehabisan Memori" ke satu entitas akan masuk akal. Membuat susunan penangan potensial dan kemudian meminta penangan tersebut mendaftar untuk kesalahan "Kehabisan Memori" tidak masuk akal; itu akan menjadi contoh penggunaan pola pengamat dalam situasi ini. Pada saat run-time Anda mungkin ingin mengubah metode apa yang dipanggil atau apa "delegasi" dipanggil untuk acara variabel tetapi mengganti penangan event untuk acara tertentu pada saat run-time tidak normal.
Bukan tidak mungkin untuk menukar delegasi seperti yang akan Anda lakukan dalam pola pengamat, itu hanya rumit. Di dunia nyata mungkin Anda ingin menukar polisi lalu lintas sehingga delegator baru menangani lalu lintas. Orang bisa berargumen bahwa desain yang lebih baik akan membuat delegasi asli menjadi kantor polisi dan bukan seorang polisi tetapi saya ngelantur ...
sumber