Apa keuntungan dari pola delegasi daripada pola pengamat?

9

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.

Jojo
sumber
4
Apa yang Anda maksud dengan "pola pendelegasian"? Jika Anda berbicara tentang sesuatu seperti delegasi .net, Anda dapat memiliki pelanggan sebanyak yang Anda suka.
CodesInChaos
Terkait, meskipun lebih fokus pada Kakao: NSNotificationCenter vs delegasi (menggunakan protokol)?
mouviciel

Jawaban:

7

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 .

pdr
sumber
6

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.

Telastyn
sumber
1
Seorang delegasi benar-benar tidak lebih dari seorang pengamat suatu peristiwa. Seorang delegasi tidak perlu "menangani" apa pun. Itu dapat dengan aman tidak melakukan apa pun dan tidak akan (atau setidaknya tidak seharusnya) memengaruhi instance yang memicu acara.
Marjan Venema
5
@MarjanVenema - jika objek A tidak mendelegasikan tanggung jawab untuk acara ke objek B, Anda tidak menggunakan pola delegasi: Anda menggunakan pola pengamat dengan hanya satu pengamat.
Telastyn
Ya, itulah yang saya pikirkan. Saya mengerti bahwa yang didelegasikan adalah jenis tanda tangan acara yang akan digunakan oleh pelanggan dari acara "Di mana pun". Rupanya delegasi dalam C # bukan pelanggan tunggal seperti pada Delphi misalnya.
Marjan Venema
@Marjan Venema "Seorang delegasi benar-benar tidak lebih dari seorang pengamat sebuah acara." - tergantung bahasa apa yang Anda bicarakan. Dalam Objective C, beberapa delegasi bertanggung jawab untuk menyediakan data - mis. Delegasi data - dan objek yang hilang delegasi data tidak memiliki data untuk disajikan. Dalam kasus-kasus itu, terjadi delegasi, berbeda dari tindakan hanya mengamati sesuatu.
occulus
1
@occulus: terima kasih atas klarifikasi. Sayang sekali bahwa bahasa tidak bisa menyetujui terminologi ... Berbicara tentang pemrograman dengan cara agnostik bahasa menjadi agak sulit ketika orang memahami hal-hal yang berbeda untuk kata-kata yang sama.
Marjan Venema
4

Itu pertanyaan dari beberapa trade-off.

Pertukaran:

  • fleksibilitas (dalam hal memiliki n> 1 delegasi / pengamat)
  • biaya pengiriman pesan
  • resilience (kemampuan untuk mempertahankan tidak tersedianya delegasi / pengamat)
  • kemudahan penggunaan

Pola pendelegasian:

  • tidak terlalu fleksibel - menambahkan lebih dari 1 delegasi tidak dimungkinkan (menyiratkan beberapa bentuk "multi-delegasi" yaitu pola pengamat)
  • mengirim pesan murah, O (1) - biaya yang sama dengan memanggil fungsi atau metode lain (tidak perlu mencari, antrian pesan atau infrastruktur lain yang diperlukan)
  • biasanya tidak tangguh - delegasi diharapkan hadir dan melakukan bagian pekerjaan mereka, yaitu pengirim cenderung gagal jika tidak diketahui delegasi
  • mudah dipahami, mudah diimplementasikan

Pola pengamat:

  • sangat fleksibel - menambahkan n> 1 pengamat diharapkan oleh desain
  • mengirim pesan memiliki biaya yang disiratkan oleh jumlah pengamat, O (n), yaitu n pengamat membutuhkan waktu dan pesan (setidaknya dalam implementasi yang naif)
  • biasanya tangguh - pengamat umumnya tidak diharapkan untuk melakukan pekerjaan apa pun pada bagian pengirim. Itu bahkan jika tidak ada pengamat pengirim tidak terpengaruh
  • dapat menjadi agak rumit untuk dipahami, khususnya para pengamat diharapkan bereaksi terhadap pesan (apakah urutan itu penting ?, yang mana pengamat merespons dengan cara apa?)
miraculixx
sumber
1

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.

Marjan Venema
sumber
Hah? Delegasi C # hanyalah tanda tangan dari suatu metode sebagai tipe variabel (setara dengan, misalnya, 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.
pdr
hmm Belum berpengalaman dalam C #. Saya mengerti bahwa delegasi setara dengan jenis tanda tangan acara yang digunakan oleh acara "OnWhthing" di misalnya Delphi. Jadi acara C # dapat berlangganan oleh beberapa pendengar?
Marjan Venema
Tindakan umum <T> adalah delegasi. Ini tidak ada hubungannya dengan peristiwa, itu variabel yang akan diedarkan. Dan ya, banyak pendengar dapat mendengarkan satu acara.
pdr
ok terima kasih, semoga saya bisa tetap lurus ... :-) Mengambil referensi C # dan lebih fokus pada mekanisme acara.
Marjan Venema
1

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 ...

Usman Mutawakil
sumber