Struktur pola iterator:
Sub-pola iteratif dapat mengakses elemen agregat secara berurutan tanpa mengekspos representasi internal agregat.
Iteratif dapat dibagi menjadi iteratif eksternal dan iteratif internal .
Iterator Eksternal: Cocok untuk agregasi kotak putih (agregasi kotak putih adalah untuk memberikan dunia luar agregasi yang mengakses antarmuka elemen internalnya). Karena logika iteratif disediakan oleh objek agregasi itu sendiri, sub-peran iterator eksternal seperti itu sering hanya mempertahankan posisi kursor iteratif. Oleh karena itu, sub-peran iteratif spesifik adalah kelas eksternal, dan konstruktornya menerima objek agregat tertentu, sehingga dapat memanggil logika iteratif dari objek agregat.
Iterator dalam: Cocok untuk agregasi kotak hitam (agregasi kotak hitam tidak menyediakan antarmuka ke luar untuk melintasi objek elemennya sendiri). Karena objek elemen yang dikumpulkan oleh Black Box hanya dapat diakses oleh anggota internal yang dikumpulkan, iterator bagian dalam hanya dapat menjadi subclass anggota di dalam agregat.
Demonstrasi sederhana:
test paket.edu.inter; antarmuka publik iteratorobj { / *** pindah ke elemen pertama* / public void first (); / *** pindah ke elemen berikutnya*/ public boolean hasnextitem (); / *** Mengembalikan elemen saat ini*/ objek publik CurrentItem (); } paket test.edu.inter; dataset antarmuka publik {public iteratoroBj getiterator (); } paket test.edu.inter; kelas publik iterator1 mengimplementasikan iteratoroBj {private DataObj set; ukuran int pribadi; indeks int pribadi = 0; ITerator Publik (set dataobj) {this.set = set; this.size = set.getSize (); } @Override public void first () {// TODO METODE AUTO-AUTOLETED Stub this.index = 0; } @Override public boolean hasnextItem () {if (index <size) {return true; } return false; } @Override Objek publik currentem () {objek ob = set.getItem (index); if (index <size) {index ++; } return ob; }} paket test.edu.inter; DataObj kelas publik mengimplementasikan dataset {private objek [] objArray = null; / *** Objek agregat yang masuk*/ data publik (objek [] objarray) {this.objarray = objaRray; } @Override public iteratoroBj getiterator () {return new iterator1 (this); } objek publik getItem (indeks int) {return objarray [index]; } public int getSize () {return objarray.length; }} paket test.edu.inter; Klien Kelas Publik { / ** * @param args * / public static void main (string [] args) {// todo Metode yang dihasilkan otomatis string string [] str = {"12312", "dasda", "dasd", "12d", "ASD"}; Dataobj ao = dataobj baru (str); Iteratorobj io = ao.getIterator (); while (io.hasnextItem ()) {System.out.println (io.currentItem ()); }}} Hasil Menjalankan:
12312 DASDA DASD 12D ASD
Ekspansi Konten: Aplikasi dalam Agregasi Java
Metode pabrik iterator () disediakan di antarmuka java.util.collection untuk mengembalikan objek tipe iterator. Subtipe antarmuka koleksi, kelas anggota dalam ITR mengimplementasikan antarmuka iterator. Jadi ITR adalah subclass iteratif intrinsik, tetapi AbstractList juga menyediakan metode traversal sendiri, jadi itu bukan agregasi kotak hitam, tetapi agregasi kotak putih. Kodenya adalah sebagai berikut:
Impor java.util.iterator; antarmuka publik ITR memperluas iterator {// indikator yang digunakan saat memanggil metode berikutnya () lagi int kursor = 0; // indikator yang digunakan dalam lastret panggilan terakhir = -1; int diharapkanmodcount = modcount; public boolean hasnext () {return cursor! = size (); } objek publik next () {coba {objek next = get (kursor); checkForComodification (); lastret = kursor ++; kembali berikutnya; } catch (indexOutofboundsException e) {checkForComodification (); Lempar NosuchelementException baru (); }} // Hapus elemen traversed terakhir, metode REMOP () hanya dapat menghapus elemen public void hapus () {if (lastret ==-1) checkForComodification (); coba {abstractlist.this.remove (lastret); if (lastret <kursor) kursor--; lastret = -1; diharapkan modcount = modcount; } catch (IndexOutOfBoundsException e) {Throw New ConcurrentModificationException (); }} public void checkForComodification () {if (modcount! = diharapkan modcount) Lempar concurrentModificationException baru (); }} Variabel dan metode seperti modcount, get (kursor) semuanya dimiliki oleh kelas abstrak, dan ITR dapat digunakan secara langsung. Metode checkForComodification () akan memeriksa apakah konten agregat baru saja dimodifikasi secara langsung oleh dunia luar (tidak dimodifikasi melalui metode lepas () yang disediakan oleh iterator). Jika konten yang dikumpulkan dilewati oleh sub-objek iteratif dan secara langsung memodifikasi tahun baru setelah sub-objek iteratif, metode ini akan segera memberikan pengecualian.
Selain itu: Kelas AbstractList juga menyediakan metode ListIterator (), mengembalikan instance Class Listitr yang mengimplementasikan antarmuka ListIterator. Antarmuka ListIterator mengimplementasikan iterasi ke depan dan iterasi terbalik, dan juga menyediakan metode untuk memodifikasi konten kolom dengan aman selama proses iterasi.
Perbedaan antara enumerasi dan iterator: (1) enumerasi tidak memiliki metode hapus (2) enumerasi diimplementasikan sebagai kelas yang tidak disebutkan namanya dalam metode elemen () dalam vektor. Itu tidak membayar untuk gagal cepat, yaitu selama proses iterasi, objek agregat secara tak terduga dimodifikasi oleh dunia luar, dan proses iterasi ini akan segera menangkap pengecualian.
Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.