Pengiriman ganda
Apa itu distribusi ganda?
Ketika berbicara tentang pemrograman yang berorientasi pada objek, kita sering berbicara tentang "polimorfisme" yang berorientasi pada objek. Di antara mereka, sering ada pepatah tentang polimorfisme bahwa "referensi kelas induk menunjuk pada objek kelas anak."
Poin referensi kelas induk ini ke objek subkelas ditulis seperti yang berikut:
Hewan hewan = anjing baru (); animal.bark ();
Bentuk lain yang biasa digunakan adalah
kiper kelas publik {public void mengatakan (hewan a) {system.out.println ("hewan mengatakan"); } public void mengatakan (anjing anjing) {System.out.println ("Dog Saying"); }} Hewan hewan = hewan baru (); Anjing hewani = anjing baru (); Penjaga penjaga = penjaga baru (); Keeper.say (hewan); Keep.say (anjing); Konten apa yang akan menjadi output ketika penjaga di atas mengatakan dua kali? Akankah dua metode berbeda dipanggil?
Bahkan, selama dua panggilan ini, metode mengatakan (hewan A) akan dipanggil. Karena konten ini dapat ditemukan dalam periode kompilasi, ini adalah distribusi statis Java.
Dari gambar di atas, kita dapat melihat bahwa bytecode yang dihasilkan oleh dua panggilan memang menunjuk ke metode Say (hewan A). Metode ini secara langsung dieksekusi saat runtime dan konten yang sesuai adalah output.
Mengapa hewan yang sesuai. Bark () akhirnya memanggil metode kelas anjing? Ini untuk menentukan jenis penerima metode spesifik saat runtime dan menjalankannya. Ini disebut distribusi dinamis, yang menentukan metode spesifik saat runtime dan mengimplementasikan polimorfisme yang berorientasi objek.
Menugaskan
Distribusi mengacu pada proses menyelesaikan metode yang akan dieksekusi.
Untuk bahasa statis seperti Java, mereka semua dieksekusi melalui distribusi tunggal (pengiriman tunggal).
Misalnya, baris kode
dog.eat(new Bone())
Eksekusi akhir dari metode EAT yang akan dipilih hanya akan memilih metode yang sesuai sesuai dengan jenis spesifik anjing, dan parameter yang diteruskan tidak dapat mempengaruhi pemilihan metode yang sesuai. Ini adalah pengiriman tunggal
Untuk membuat parameter nyata masuk, tulang ada di sini untuk benar -benar memainkan peran, Anda perlu menggunakan pengiriman ganda atau beberapa pengiriman
Dengan kata lain, keputusan akhir bukan hanya penerima metode, tetapi juga jenis parameter.
Mode pengunjung
Dalam mode desain GOF, mode pengunjung menggunakan pengiriman ganda untuk mencapai tujuan memanggil objek nyata.
Untuk mode pengunjung, contoh yang paling umum adalah traversal pohon. Misalnya, ada perbedaan cara untuk memproses node dan daun. Ini dilakukan melalui distribusi ganda pengunjung untuk mengimplementasikan berbagai elemen dan menjalankan konten yang berbeda.
Kode terlihat seperti ini:
node.accept (concreateVisitor baru ()); leaf.accept (concreateVisitor baru ());
Metode penerimaan dalam simpul akan meneruskan tipe sebenarnya kembali ke pengunjung lagi
public void accept (pengunjung v) {v.visit (ini); }Pada saat ini, di pengunjung, Anda dapat memanggil metode spesifik sesuai dengan tipe nyata, dan ada metode yang mirip dengan yang sesuai dengan node dan daun:
kunjungan public void (simpul n); kunjungan public void (daun l);
Pengunjung untuk menyimpulkan, umumnya mencakup antarmuka pengunjung. Di antarmuka pengunjung, ini berisi logika pemrosesan dari setiap objek elemen yang akan diakses. Dalam implementasi spesifik dari setiap elemen, Anda meneruskan tipe Anda sendiri kembali ke pengunjung untuk distribusi sekunder untuk mengimplementasikan panggilan logika yang tepat.
Aplikasi di Tomcat
Pengunjung juga digunakan di Tomcat, biasanya mem -parsing EL Expressions.
Misalnya org.apache.el.parser.node
Kelas ini berisi metode penerimaan (pengunjung nodevisitor)
Ada banyak jenis simpul yang sebenarnya, tetapi pada saat panggilan nyata ini, itu akan berlalu
public void accept (nodevisitor pengunjung) melempar Exception {Visitor.Visit (ini);Melewati tipe nyata kembali ke pengunjung, metode tertentu akan dipanggil dalam visor, sehingga parameter juga dapat memainkan peran yang menentukan.
public void kunjungan (simpul simpul) melempar Elexception {if (node instanceof astfunction) {astfunction funcnode = (astfunction) node; Metode m = null; } lain jika (xxx) {} Di sini, beberapa metode kunjungan akan dinyatakan, dan kunjungan di atas (ini) akan langsung berlokasi pada metode target.
Di atas adalah berbagai distribusi dalam Java dan model pengunjung untuk mencapai distribusi ganda melalui bentuk pola. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan. Editor akan membalas semua orang tepat waktu!