Definisi: Menyediakan metode untuk mengakses berbagai elemen dalam objek kontainer tanpa mengekspos detail internal objek.
Jenis: Pola perilaku
Diagram kelas:
Jika Anda ingin menanyakan mode yang paling umum digunakan di Java, jawabannya bukanlah mode singleton, atau mode pabrik, atau mode strategi, tetapi mode iterator. Mari kita lihat sepotong kode terlebih dahulu:
public static void print (collection coll) {iterator it = coll.iterator (); while (it.hasnext ()) {string str = (string) it.next (); System.out.println (str); }} Fungsi metode ini adalah mencetak loop pengumpulan string, dan pola iterator digunakan dalam pola iterator. Bahasa Java telah sepenuhnya menerapkan pola iterator. Iterator diterjemahkan ke dalam bahasa Cina berarti iterator. Ketika datang ke iterator, pertama -tama, itu terkait dengan set. Set juga disebut agregat, wadah, dll. Kita dapat menganggap set sebagai wadah yang dapat berisi objek. Misalnya, daftar, set, peta, dan bahkan array dapat disebut set. Fungsi iterator adalah untuk melintasi objek dalam wadah satu per satu.
Struktur pola iterator
Metode Abstrak: Umumnya, Iterator () disediakan, seperti antarmuka koleksi, antarmuka daftar, set antarmuka, dll. Di Java.
Kontainer Khusus: Ini adalah kelas implementasi konkret dari kontainer abstrak, seperti daftar antarmuka daftar yang dipesan untuk mengimplementasikan daftar array, daftar antarmuka daftar yang ditautkan untuk mengimplementasikan LinkList, daftar hash antarmuka yang ditetapkan untuk mengimplementasikan hashset, dll.
Abstrak Iterator: Tentukan metode yang diperlukan untuk melintasi elemen. Secara umum, ada tiga metode: dapatkan metode pertama () dari elemen pertama, dapatkan metode berikutnya () dari elemen berikutnya, tentukan apakah metode traversal ujung isdone () (atau hasnext ()), lepaskan () dari objek saat ini,
Implementasi Iterator: Mengimplementasikan metode yang ditentukan dalam antarmuka Iterator untuk menyelesaikan iterasi koleksi.
Berikan contoh
Karena peraturan mode iterator itu sendiri relatif longgar, implementasi spesifiknya beragam. Mari kita berikan hanya satu contoh di sini, dan kami tidak dapat menyajikan metode implementasi satu per satu. Oleh karena itu, sebelum memberikan contoh, mari kita daftarkan metode implementasi dari pola iterator berikutnya.
1. Peran Iterator mendefinisikan antarmuka untuk traversal, tetapi tidak menentukan siapa yang mengendalikan iterasi. Dalam penerapan koleksi Java, proses traversal dikendalikan oleh program klien, yang disebut iterator eksternal; Metode implementasi lain adalah mengendalikan iterator itu sendiri, yang disebut iterator internal. Iterator eksternal fleksibel dan kuat daripada iterator internal, dan iterator internal sangat lemah di lingkungan lokal Java.
2. Tidak ada ketentuan untuk siapa yang akan mengimplementasikan algoritma traversal dalam mode Iterator. Tampaknya wajar untuk diterapkan dalam peran iterator. Karena nyaman untuk algoritma traversal yang berbeda untuk digunakan pada wadah, juga nyaman untuk menerapkan algoritma traversal ke wadah yang berbeda. Tetapi ini menghancurkan enkapsulasi wadah - peran wadah harus mengungkapkan atribut pribadinya sendiri, yang dalam Java berarti mengekspos atribut pribadinya sendiri ke kelas lain.
Lalu mari kita masukkan ke dalam peran wadah untuk mengimplementasikannya. Dengan cara ini, peran iterator ditimpa hanya untuk menyimpan fungsi yang melintasi lokasi saat ini. Tetapi algoritma traversal terikat erat dengan wadah tertentu.
Dalam penerapan pengumpulan Java, peran iterator spesifik yang diberikan adalah kelas internal yang ditentukan dalam peran kontainer. Ini melindungi kemasan wadah. Tetapi pada saat yang sama, wadah ini juga menyediakan antarmuka algoritma traversal, dan Anda dapat memperpanjang iterator Anda sendiri.
Oke, mari kita lihat bagaimana Iterator dalam koleksi Java diimplementasikan.
// Peran Iterator, hanya mendefinisikan antarmuka antarmuka interface traversal iterator {boolean hasnext (); Objek selanjutnya (); batal lepas ();} // Peran kontainer, ambil daftar sebagai contoh di sini. Ini hanya antarmuka, jadi tidak akan terdaftar. Peran wadah spesifik adalah ArrayList dan kelas lain yang mengimplementasikan antarmuka daftar. Untuk menyoroti poin -poin utama, kami merujuk pada konten yang terkait dengan iterator // Peran iterator spesifik diturunkan dalam bentuk kelas internal. AbstractList ada untuk mengekstraksi bagian umum dari setiap peran wadah spesifik. Kelas Abstrak Publik AbstractList memperluas AbstrakCollection mengimplementasikan daftar {... // Ini adalah metode pabrik yang bertanggung jawab untuk membuat peran iterator spesifik iterator publik () {return new iTr ();} // sebagai peran iterator spesifik dari kelas internal ITR mengimplementasikan iterator {int kursor = 0; int lastret = -1; int diharapkanmodcount = modcount; public boolean hasnext () {return cursor! = size (); } objek publik next () {checkForComodification (); coba {objek next = get (kursor); lastret = kursor ++; kembali berikutnya; } catch (indexOutofboundsException e) {checkForComodification (); Lempar NosuchelementException baru (); }} public void remeFe () {if (lastret == -1) Lempar baru ilegalstateException (); checkForComodification (); coba {abstractlist.this.remove (lastret); if (lastret <kursor) kursor--; lastret = -1; diharapkan modcount = modcount; } catch (IndexOutOfBoundsException e) {Throw New ConcurrentModificationException (); }} final void checkForComodification () {if (modcount! = diharapkan modcount) lempar concurrentModificationException baru (); }}Adapun penggunaan mode iterator. Seperti yang tercantum dalam pendahuluan, program klien perlu mendapatkan peran wadah spesifik terlebih dahulu, dan kemudian mendapatkan peran iterator spesifik melalui peran wadah spesifik. Dengan cara ini, Anda dapat menggunakan peran iterator spesifik untuk melintasi wadah ...
Pro dan kontra dari mode iterator
Keuntungan dari mode iterator adalah:
Metode traversal telah disederhanakan, dan masih cukup merepotkan untuk melintasi koleksi objek. Untuk array atau daftar yang dipesan, kami masih dapat memperolehnya melalui kursor, tetapi pengguna perlu melintasi objek sendiri di premis bahwa mereka memiliki pemahaman yang jelas tentang koleksi tersebut. Namun, untuk tabel hash, lebih merepotkan untuk melintasi pengguna. Setelah memperkenalkan metode Iterator, jauh lebih mudah untuk digunakan pengguna.
Ada banyak cara untuk melintasi, seperti untuk daftar yang dipesan, kami dapat memberikan dua iterator dengan urutan positif dan traversal urutan terbalik sesuai dengan kebutuhan. Pengguna hanya perlu mendapatkan iterator yang kami terapkan untuk dengan mudah melintasi koleksi.
Enkapsulasi itu bagus, dan pengguna hanya perlu mendapatkan iterator untuk dilintasi, tetapi mereka tidak perlu khawatir tentang algoritma traversal.
Kerugian dari pola iterator:
Untuk traversal sederhana (seperti array atau daftar yang dipesan), lebih rumit untuk menggunakan iterator, dan semua orang mungkin merasa bahwa, seperti arraylist, kami lebih suka menggunakan loop dan mendapatkan metode untuk melintasi koleksi.
Skenario yang berlaku untuk mode Iterator
Pola iterator adalah simbiotik dan kematian dengan koleksi. Secara umum, selama kami menerapkan koleksi, kami perlu memberikan iterator koleksi secara bersamaan, seperti koleksi, daftar, set, peta, dll. Di Java, koleksi ini memiliki iterator mereka sendiri. Jika kami ingin mengimplementasikan wadah baru seperti itu, tentu saja kami juga perlu memperkenalkan pola iterator untuk mengimplementasikan iterator untuk wadah kami.
Namun, karena hubungan antara wadah dan iterator terlalu dekat, sebagian besar bahasa menyediakan iterator saat menerapkan wadah, dan wadah dan iterator yang disediakan oleh bahasa -bahasa ini dapat memenuhi kebutuhan kita dalam banyak kasus. Oleh karena itu, relatif jarang untuk mempraktikkan pola iterator sendiri. Kita hanya perlu menggunakan wadah dan iterator yang ada dalam bahasa.