Desain Pengunjung Pola

chmood
Desain Pengunjung Pola
Maksud

   Merupakan operasi yang akan dilakukan pada elemen struktur objek. Pengunjung memungkinkan Anda menentukan operasi baru tanpa mengubah kelas dari elemen yang beroperasi.
Teknik klasik untuk memulihkan informasi jenis hilang.
Melakukan hal yang benar berdasarkan pada jenis dua benda.
Dispatch ganda

Masalah
    Banyak operasi yang berbeda dan tidak berhubungan perlu dilakukan pada objek node dalam struktur agregat heterogen. Anda ingin menghindari "polusi" kelas simpul dengan operasi ini. Dan, Anda tidak ingin harus query jenis setiap node dan melemparkan pointer ke jenis yang tepat sebelum melakukan operasi yang diinginkan.


Diskusi
   Tujuan utama pengunjung adalah untuk fungsi abstrak yang dapat diterapkan untuk hirarki agregat "elemen" benda. Pendekatan ini mendorong merancang kelas Element ringan - karena fungsi pengolahan dihapus dari daftar mereka tanggung jawab. Fungsi baru dapat dengan mudah ditambahkan ke hirarki warisan asli dengan menciptakan baru subclass pengunjung.

    Pengunjung mengimplementasikan "ganda pengiriman". OO pesan secara rutin menampakkan "dispatch single" - operasi yang dijalankan tergantung pada: nama permintaan, dan jenis penerima. Dalam "ganda pengiriman", operasi dijalankan tergantung pada: nama permintaan, dan jenis DUA penerima (jenis dari pengunjung dan jenis elemen itu mengunjungi).

    Pelaksanaan hasil sebagai berikut. Buat kelas hirarki Pengunjung yang mendefinisikan metode kunjungan virtual murni () di kelas dasar abstrak untuk setiap beton kelas turunan dalam hirarki simpul agregat. Setiap metode kunjungan () menerima argumen tunggal - pointer atau referensi ke sebuah Elemen berasal kelas yang asli.

    Setiap operasi harus didukung dimodelkan dengan beton kelas turunan dari hirarki pengunjung. Kunjungan () metode dideklarasikan di kelas dasar Pengunjung sekarang didefinisikan dalam setiap subclass diperoleh mengalokasikan "jenis query dan cor" kode dalam pelaksanaan asli untuk yang sesuai kelebihan beban kunjungan () metode.

    Menambahkan metode virtual murni tunggal menerima () untuk kelas dasar dari hirarki Element. menerima () didefinisikan untuk menerima satu argumen - pointer atau referensi ke kelas dasar abstrak hirarki pengunjung.

   Setiap beton kelas turunan dari hirarki Elemen mengimplementasikan metode menerima () dengan hanya memanggil kunjungan () metode di beton berasal contoh hirarki pengunjung yang disahkan, melewati nya "ini" pointer sebagai satu-satunya argumen.

    Semuanya untuk "elemen" dan "pengunjung" sekarang set-up. Ketika klien membutuhkan operasi yang akan dilakukan, (s) ia menciptakan sebuah instance dari objek Vistor, menyebut menerima () metode pada setiap objek Element, dan melewati objek pengunjung.

    Menerima () metode menyebabkan aliran kontrol untuk menemukan Elemen subclass yang benar. Kemudian ketika metode kunjungan () dipanggil, aliran kontrol vektor untuk benar subclass pengunjung. menerima () pengiriman ditambah kunjungan () dispatch sama pengiriman ganda.

    Pola Pengunjung membuat menambahkan operasi baru (atau utilitas) mudah - hanya menambahkan Pengunjung baru kelas turunan. Tapi, jika subclass dalam hirarki simpul agregat tidak stabil, menjaga subclass pengunjung sinkron memerlukan sejumlah penghalang usaha.

    Keberatan diakui dengan pola pengunjung adalah yang mewakili regresi untuk dekomposisi fungsional - memisahkan algoritma dari struktur data. Meskipun ini merupakan interpretasi yang sah, mungkin lebih baik perspektif / pemikiran adalah tujuan mempromosikan perilaku non-tradisional dengan status objek penuh.

Struktur
   Hirarki Elemen ini diinstrumentasi dengan "universal metode adaptor". Pelaksanaan menerima () di masing-masing kelas Element berasal selalu sama. Tapi - tidak dapat dipindahkan ke kelas dasar Elemen dan diwarisi oleh semua kelas turunan karena referensi untuk ini di kelas Elemen selalu peta untuk tipe dasar Elemen.



Ketika metode firstDispatch polimorfik () disebut pada objek Pertama abstrak, jenis beton objek yang "ditemukan". Ketika metode secondDispatch polimorfik () disebut pada objek Kedua abstrak, jenis beton yang adalah "sembuh". Fungsionalitas aplikasi yang sesuai untuk pasangan ini dari jenis sekarang dapat dilakukan.




Contoh  
   Pola Pengunjung merupakan operasi yang akan dilakukan pada elemen struktur objek tanpa mengubah kelas di mana ia beroperasi. Pola ini dapat diamati dalam operasi perusahaan taksi. Ketika seseorang memanggil perusahaan taksi (menerima pengunjung), perusahaan mengirimkan taksi kepada pelanggan. Setelah memasuki taksi pelanggan, atau pengunjung, tidak lagi mengendalikan transportasi sendiri, taksi (driver) adalah.


                                


Periksa daftar
   Mengkonfirmasi bahwa hierarki saat ini (dikenal sebagai hirarki Element) akan cukup stabil dan bahwa antarmuka publik dari kelas-kelas ini cukup untuk akses kelas Pengunjung akan membutuhkan. Jika kondisi ini tidak terpenuhi, maka pola pengunjung tidak cocok.
Menciptakan basis kelas Pengunjung dengan kunjungan (ElementXxx) metode untuk setiap Elemen tipe turunan.


Menambahkan metode menerima (pengunjung) ke hirarki Element. Pelaksanaan di masing-masing kelas Element berasal selalu sama - menerima (v Pengunjung) {v.visit (ini); }. Karena dependensi siklik, deklarasi Elemen dan pengunjung kelas perlu disisipkan.


Hirarki Elemen digabungkan hanya untuk kelas dasar Pengunjung, tapi hirarki Pengunjung digabungkan ke setiap Element berasal kelas. Jika stabilitas hirarki Element rendah, dan stabilitas hirarki Pengunjung tinggi; mempertimbangkan menukar 'peran' dari dua hierarki.


Buat pengunjung yang berasal kelas untuk setiap "operasi" yang akan dilakukan pada objek Element. Kunjungan () implementasi akan bergantung pada antarmuka publik Elemen ini.
Klien menciptakan objek Pengunjung dan melewati masing-masing untuk objek Element dengan memanggil menerima ().

Aturan praktis
   Pohon sintaks abstrak Interpreter adalah Komposit (karena itu Iterator dan Pengunjung juga berlaku).


Iterator dapat melintasi Komposit. Pengunjung dapat menerapkan operasi selama Komposit.
Pola Pengunjung adalah seperti pola Command lebih kuat karena pengunjung dapat memulai apa pun yang sesuai untuk jenis objek itu pertemuan.


Pola Pengunjung adalah teknik klasik untuk memulihkan informasi jenis hilang tanpa menggunakan gips dinamis.


Catatan
November 2000 isu JavaPro memiliki sebuah artikel oleh James Cooper (penulis pendamping Jawa ke GOF) pada pola desain Pengunjung. Dia menyarankan itu "mengubah tabel pada model berorientasi objek dan menciptakan kelas eksternal untuk bertindak atas data dalam kelas-kelas lain ... sementara ini mungkin tampak haram ... ada alasan yang baik untuk melakukannya."

Contoh utamanya. Misalkan Anda memiliki hirarki Karyawan-Insinyur-Boss. Mereka semua menikmati hari liburan kebijakan akrual normal, tapi, Bos juga berpartisipasi dalam "bonus" Program hari liburan. Akibatnya, antarmuka dari Boss kelas berbeda dari yang kelas Engineer. Kita tidak bisa polymorphically melintasi sebuah organisasi Komposit-seperti dan menghitung total sisa hari liburan organisasi. "Pengunjung menjadi lebih berguna ketika ada beberapa kelas dengan antarmuka yang berbeda dan kami ingin merangkum bagaimana kita mendapatkan data dari kelas-kelas ini."

Manfaat nya untuk Pengunjung meliputi:
Menambahkan fungsi ke perpustakaan kelas yang Anda juga tidak memiliki sumber atau tidak dapat mengubah sumber


Mendapatkan data dari koleksi yang berbeda dari kelas yang tidak terkait dan menggunakannya untuk menyajikan hasil perhitungan global untuk program pengguna
Kumpulkan operasi terkait ke dalam satu kelas daripada memaksa Anda untuk mengubah atau menurunkan kelas untuk menambahkan operasi ini
Berkolaborasi dengan pola Composite

Pengunjung tidak baik untuk situasi di mana "mengunjungi" kelas tidak stabil. Setiap kali hirarki Komposit berasal kelas baru ditambahkan, setiap pengunjung yang berasal kelas harus diubah



Komentar