โครงสร้างของรูปแบบตัววนซ้ำ:
รูปแบบย่อยซ้ำสามารถเข้าถึงองค์ประกอบที่รวมตามลำดับโดยไม่เปิดเผยการเป็นตัวแทนภายในที่รวมเข้าด้วยกัน
การวนซ้ำสามารถแบ่งออกเป็น ซ้ำภายนอก และ ซ้ำภายใน
ตัววนซ้ำภายนอก: เหมาะสำหรับการรวมกล่องสีขาว (การรวมกล่องสีขาวคือการให้โลกภายนอกมีการรวมตัวที่เข้าถึงส่วนต่อประสานองค์ประกอบภายใน) เนื่องจากลอจิกวนซ้ำถูกจัดทำโดยวัตถุการรวมตัวเองบทบาทย่อยตัววนซ้ำภายนอกจึงมักจะรักษาตำแหน่งเคอร์เซอร์ของการวนซ้ำเท่านั้น ดังนั้นบทบาทย่อยซ้ำที่เฉพาะเจาะจงคือคลาสภายนอกและตัวสร้างของมันยอมรับวัตถุรวมเฉพาะเพื่อให้สามารถเรียกตรรกะซ้ำของวัตถุรวม
INNER ITERATOR: เหมาะสำหรับการรวมกล่องดำ (การรวมกล่องดำไม่ได้ให้อินเทอร์เฟซกับด้านนอกเพื่อสำรวจวัตถุองค์ประกอบของตัวเอง) เนื่องจากวัตถุองค์ประกอบที่รวบรวมโดยกล่องดำสามารถเข้าถึงได้โดยสมาชิกภายในที่รวมกันเท่านั้นตัววนซ้ำภายในสามารถเป็นคลาสย่อยของสมาชิกภายในการรวมเท่านั้น
การสาธิตอย่างง่าย:
Package Test.edu.inter; อินเทอร์เฟซสาธารณะ iteratorobj { / *** ย้ายไปยังองค์ประกอบแรก* / โมฆะสาธารณะก่อน (); / *** ย้ายไปยังองค์ประกอบถัดไป*/ บูลีนสาธารณะ hasnextitem (); / *** ส่งคืนองค์ประกอบปัจจุบัน*/ วัตถุสาธารณะ CurpantItem (); } package test.edu.inter; ชุดข้อมูลส่วนต่อประสานสาธารณะ {Public Iteratorobj getIterator (); } package test.edu.inter; Public Class Iterator1 ใช้ iteratorobj {ชุดข้อมูลส่วนตัว DataObj; ขนาด int ส่วนตัว; ดัชนี int ส่วนตัว = 0; Public Iterator1 (ชุดข้อมูล dataObj) {this.set = set; this.size = set.getSize (); } @Override โมฆะสาธารณะก่อน () {// todo วิธีการที่สร้างอัตโนมัติ stub this.index = 0; } @Override บูลีนสาธารณะ hasnextitem () {ถ้า (ดัชนี <ขนาด) {return true; } return false; } @Override วัตถุสาธารณะ CurpantItem () {Object ob = set.getItem (ดัชนี); if (index <size) {index ++; } return ob; }} package test.edu.inter; คลาสสาธารณะ DataObj ใช้ชุดข้อมูล {วัตถุส่วนตัว [] objarray = null; / *** วัตถุรวมที่เข้ามา*/ public dataObj (object [] objarray) {this.objarray = objarray; } @Override Public IteratorObj getIterator () {return ใหม่ iterator1 (นี่); } วัตถุสาธารณะ getItem (ดัชนี int) {ส่งคืน objarray [ดัชนี]; } public int getSize () {return objarray.length; }} package test.edu.inter; ไคลเอนต์คลาสสาธารณะ { / ** * @param args * / โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// todo วิธีการที่สร้างอัตโนมัติ stub String [] str = {"12312", "dasda", "dasd", "12d", "asd"}; dataObj ao = new dataObj (str); Iteratorobj io = ao.getIterator (); ในขณะที่ (io.hasnextitem ()) {system.out.println (io.currentitem ()); - ผลการทำงาน:
12312 Dasda Dasd 12d ASD
การขยายเนื้อหา: แอปพลิเคชันในการรวม Java
วิธี iterator () โรงงานมีให้ในอินเตอร์เฟส java.util.collection เพื่อส่งคืนวัตถุประเภทตัววนซ้ำ ชนิดย่อยของอินเทอร์เฟซคอลเลกชันคลาสสมาชิกด้านใน ITR ใช้อินเตอร์เฟสตัววนซ้ำ ดังนั้น ITR จึงเป็นคลาสย่อยซ้ำที่แท้จริง แต่ AbstractList ยังให้วิธีการสำรวจของตัวเองดังนั้นจึงไม่ใช่การรวมกล่องดำ แต่เป็นการรวมกล่องสีขาว รหัสมีดังนี้:
นำเข้า java.util.iterator; อินเทอร์เฟซสาธารณะ ITR ขยาย Iterator {// ตัวบ่งชี้ที่ใช้เมื่อเรียกเมธอดถัดไป () อีกครั้ง int cursor = 0; // ตัวบ่งชี้ที่ใช้ในการโทรครั้งสุดท้าย lastret = -1; int คาดหวัง modCount = modCount; บูลีนสาธารณะ hasnext () {กลับเคอร์เซอร์! = size (); } วัตถุสาธารณะถัดไป () {ลอง {object next = get (เคอร์เซอร์); checkforcomodification (); Lastret = เคอร์เซอร์ ++; กลับมาถัดไป; } catch (indexoutofboundsexception e) {checkforcomodification (); โยน nosuchelementexception ใหม่ (); }} // ลบองค์ประกอบ Traversed ล่าสุดวิธีการลบ () สามารถลบโมฆะโพลล์สาธารณะที่ผ่านการสำรวจครั้งสุดท้ายลบ () {ถ้า (LASTRET ==-1) โยน unlEgalStateException ใหม่ (); checkforcomodification (); ลอง {Abstractlist.his.remove (Lastret); ถ้าเคอร์เซอร์ (Lastret <เคอร์เซอร์)-; Lastret = -1; คาดว่า ModCount = ModCount; } catch (indexoutofboundsexception e) {โยนใหม่พร้อมกันใหม่ Exception (); }} โมฆะสาธารณะ checkForComodification () {ถ้า (modcount! = คาดหวัง modcount) โยนใหม่พร้อมกัน modificationException (); - ตัวแปรและวิธีการเช่น modcount, Get (เคอร์เซอร์) ล้วนเป็นเจ้าของโดยคลาส AbstractList และ ITR สามารถใช้โดยตรง วิธีการตรวจสอบ FORCOMODIFICITION () จะตรวจสอบว่าเนื้อหาที่รวมได้รับการแก้ไขโดยตรงโดยโลกภายนอก (ไม่ได้แก้ไขผ่านวิธีการลบ () ที่จัดทำโดยตัววนซ้ำ) หรือไม่ หากเนื้อหาที่รวบรวมถูกบายพาสโดยวัตถุย่อยซ้ำและแก้ไขปีใหม่โดยตรงหลังจากวัตถุย่อยซ้ำวิธีนี้จะทำการยกเว้นทันที
นอกจากนี้: คลาส AbstractList Class ยังมีเมธอด listiterator () โดยส่งคืนอินสแตนซ์ของรายการรายการที่ใช้อินเทอร์เฟซ listiterator อินเทอร์เฟซ listiterator ใช้การทำซ้ำและการทำซ้ำย้อนกลับและยังมีวิธีการในการแก้ไขเนื้อหาของคอลัมน์อย่างปลอดภัยในระหว่างกระบวนการวนซ้ำ
ความแตกต่างระหว่างการแจงนับและตัววนซ้ำ: (1) การแจงนับไม่มีวิธีการลบ (2) การแจงนับถูกนำมาใช้เป็นคลาสที่ไม่มีชื่อในวิธีการองค์ประกอบ () ในเวกเตอร์ มันไม่ได้จ่ายสำหรับความล้มเหลวอย่างรวดเร็วนั่นคือในระหว่างกระบวนการวนซ้ำวัตถุที่รวมจะถูกแก้ไขโดยไม่คาดคิดโดยโลกภายนอกและกระบวนการวนซ้ำนี้จะจับข้อยกเว้นใด ๆ ทันที
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน