23 Pola Desain Bab 16: Pola Pengunjung Java
Definisi: merangkum operasi tertentu yang bertindak pada setiap elemen dalam struktur data tertentu. Ini dapat mendefinisikan operasi baru yang bertindak pada elemen -elemen ini tanpa mengubah struktur data.
Jenis: Pola perilaku
Diagram kelas:
Mode pengunjung mungkin merupakan mode yang paling kompleks di antara mode perilaku, tetapi ini tidak bisa menjadi alasan mengapa kita tidak menguasainya.
Mari kita lihat contoh sederhana, kodenya adalah sebagai berikut
kelas A {public void method1 () {System.out.println ("I Am a"); } public void method2 (b b) {b.showa (this); }} class b {public void showa (a) {a.method1 (); }}Mari kita lihat apa perbedaan antara metode metode1 dan metode metode2 di kelas A. Metode metode1 sangat sederhana, cukup cetak kalimat "I Am a"; Metode Metode2 sedikit lebih rumit, gunakan Kelas B sebagai parameter, dan panggil metode Showa dari Kelas B.
Mari kita lihat metode Showa dari Kelas B. Metode Showa menggunakan Kelas A sebagai parameter, dan kemudian memanggil metode Method1 dari Kelas A. Anda dapat melihat bahwa metode Method2 hanya memanggil metode Method1 sendiri. Hasil berjalannya juga harus menjadi "Saya seorang". Setelah analisis, mari kita jalankan kedua metode ini dan lihat hasil lari:
tes kelas publik {public static void main (string [] args) {a a = new a (); a.method1 (); a.method2 (baru b ()); }}Hasil berjalan adalah:
Saya seorang
Saya seorang
Setelah memahami contoh ini, Anda akan memahami 90% dari pola pengunjung. Dalam contoh, untuk Kelas A, Kelas B adalah pengunjung. Namun, contoh ini bukan seluruh mode pengunjung. Meskipun intuitif, ia memiliki skalabilitas yang buruk. Mari kita bicara tentang implementasi umum mode pengunjung. Anda dapat melihat melalui diagram kelas bahwa dalam mode pengunjung, peran berikut ini terutama termasuk:
Pengunjung Abstrak: Kelas atau antarmuka abstrak yang menyatakan elemen mana yang dapat diakses pengunjung. Khususnya dalam program, parameter dalam metode kunjungan menentukan objek mana yang dapat diakses.
Pengunjung: Menerapkan metode yang dinyatakan oleh pengunjung abstrak, yang memengaruhi apa yang harus dilakukan pengunjung dan apa yang harus mereka lakukan setelah mengakses kelas.
Kelas Elemen Abstrak: Antarmuka atau kelas abstrak yang menyatakan jenis akses pengunjung mana yang diterima. Program ini didefinisikan melalui parameter dalam metode penerimaan. Umumnya ada dua jenis metode untuk elemen abstrak, satu adalah logika bisnisnya sendiri, dan yang lainnya adalah jenis pengunjung mana yang diizinkan untuk diakses.
Kelas Elemen: Menerapkan metode penerimaan yang dinyatakan oleh kelas elemen abstrak, biasanya pengunjung. Visit (ini), dan pada dasarnya telah membentuk rumus tetap.
Objek Struktural: Wadah elemen umumnya berisi wadah yang mengakomodasi beberapa kelas dan antarmuka yang berbeda, seperti daftar, set, peta, dll. Peran ini jarang diabstraksi dalam proyek.
Implementasi kode umum mode pengunjung
elemen kelas abstrak {public abstrak void menerima (pengunjung ivisitor); dosomething abstrak publik (); } antarmuka ivisitor {public void kunjungan (concreteelement1 el1); kunjungan public void (concreteelement2 el2); } class concreteelement1 memperluas elemen {public void dosomething () {System.out.println ("This is Element 1"); } public void accept (ivisitor pengunjung) {visitor.visit (ini); }} class concreteelement2 memperluas elemen {public void dosomething () {System.out.println ("This is Element 2"); } public void accept (ivisitor pengunjung) {visitor.visit (ini); }} Class Visitor mengimplementasikan ivisitor {public void kunjungan (concreteelement1 el1) {el1.dosomething (); } kunjungan public void (concreteelement2 el2) {el2.dosomething (); }} class ObjectStruture {Public Static List <sement> getList () {List <sement> list = new ArrayList <sement> (); Rand ran = acak baru (); untuk (int i = 0; i <10; i ++) {int a = ran.nextint (100); if (a> 50) {list.add (concreteelement1 baru ()); } else {list.add (concreteelement baru ()); }} daftar pengembalian; }} kelas public client {public static void main (string [] args) {list <sement> list = objectStruture.getList (); untuk (elemen e: daftar) {e.accept (pengunjung baru ()); }}} Keuntungan dari mode pengunjung
Mematuhi prinsip tanggung jawab tunggal: dalam skenario apa pun di mana mode pengunjung berlaku, operasi yang perlu dienkapsulasi dalam pengunjung di kelas elemen harus berupa operasi yang tidak ada hubungannya dengan kelas elemen itu sendiri dan mudah berubah. Di satu sisi, penggunaan mode pengunjung sesuai dengan prinsip tanggung jawab tunggal, dan di sisi lain, karena operasi yang dienkapsulasi biasanya tidak stabil, ketika perubahan terjadi, perluasan bagian yang berubah dapat dicapai tanpa mengubah kelas elemen itu sendiri.
Skalabilitas yang baik: Kelas elemen dapat memperluas operasi yang berbeda dengan menerima pengunjung yang berbeda.
Skenario yang berlaku untuk mode pengunjung
Jika ada beberapa operasi dalam suatu objek yang tidak terkait dengan objek (atau terkait lemah) dan untuk menghindari operasi ini yang mencemari objek, Anda dapat menggunakan mode pengunjung untuk merangkum operasi ini ke dalam pengunjung.
Jika ada operasi serupa dalam sekelompok objek, untuk menghindari sejumlah besar kode duplikat, operasi duplikat ini juga dapat dienkapsulasi ke dalam pengunjung.
Namun, mode pengunjung tidak begitu sempurna, dan juga memiliki kelemahan fatal: menambahkan kelas elemen baru lebih sulit. Melalui kode pola pengunjung, kita dapat melihat bahwa di kelas pengunjung, setiap kelas elemen memiliki metode pemrosesan yang sesuai. Dengan kata lain, setiap kelas elemen perlu ditambahkan untuk memodifikasi kelas pengunjung (juga termasuk kelas subkelas atau implementasi kelas pengunjung), yang cukup merepotkan untuk dimodifikasi. Dengan kata lain, ketika jumlah kelas elemen tidak pasti, mode pengunjung harus digunakan dengan hati -hati. Oleh karena itu, mode pengunjung lebih cocok untuk refactoring fungsi yang ada. Misalnya, jika fungsi dasar suatu proyek telah ditentukan, data kelas elemen pada dasarnya telah ditentukan dan tidak akan berubah. Semua yang akan berubah adalah operasi yang relevan dalam elemen -elemen ini. Pada saat ini, kita dapat menggunakan mode pengunjung untuk refactor kode asli, sehingga fungsi asli dapat dimodifikasi tanpa memodifikasi setiap kelas elemen.
Meringkaskan
Sebagai GOF, penulis pola desain, menjelaskan mode pengunjung: Dalam kebanyakan kasus, Anda perlu menggunakan mode pengunjung, tetapi begitu Anda membutuhkannya, Anda benar -benar membutuhkannya. Tentu saja ini hanya untuk orang -orang besar yang sebenarnya. Pada kenyataannya (setidaknya di lingkungan tempat saya berada), banyak orang sering kecanduan pola desain. Saat menggunakan pola desain, mereka tidak pernah secara serius mempertimbangkan apakah pola yang mereka gunakan cocok untuk skenario ini, tetapi seringkali hanya ingin menunjukkan kemampuan mereka untuk mengontrol desain yang berorientasi objek. Jika Anda memiliki mentalitas ini saat pemrograman, Anda sering menyalahgunakan pola desain. Oleh karena itu, ketika belajar pola desain, Anda harus memahami penerapan pola. Penting untuk menggunakan suatu pola karena Anda memahami kelebihannya, bukan untuk menggunakan suatu pola karena Anda memahami kerugiannya; Daripada menggunakan pola karena Anda tidak memahami kerugiannya, bukan untuk menggunakan pola karena Anda tidak memahami kelebihannya.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.