โหมดตัววนซ้ำหรือที่เรียกว่าโหมดเคอร์เซอร์ คำจำกัดความที่กำหนดโดย GOF คือการให้วิธีการเข้าถึงองค์ประกอบต่าง ๆ ในวัตถุคอนเทนเนอร์โดยไม่เปิดเผยรายละเอียดภายในของวัตถุ
รูปแบบตัววนซ้ำประกอบด้วยบทบาทต่อไปนี้:
บทบาทตัววนซ้ำ: บทบาทตัววนซ้ำมีหน้าที่กำหนดอินเทอร์เฟซเพื่อเข้าถึงและสำรวจองค์ประกอบ
บทบาทตัววนซ้ำคอนกรีต: บทบาทตัววนซ้ำที่เฉพาะเจาะจงจำเป็นต้องใช้อินเตอร์เฟสตัววนซ้ำและบันทึกตำแหน่งปัจจุบันในการสำรวจ
คอนเทนเนอร์: บทบาทคอนเทนเนอร์มีหน้าที่รับผิดชอบในการจัดหาอินเทอร์เฟซเพื่อสร้างบทบาทตัววนซ้ำที่เฉพาะเจาะจง
คอนกรีตคอนเทนเนอร์: บทบาทคอนเทนเนอร์เฉพาะใช้อินเทอร์เฟซเพื่อสร้างบทบาทตัววนซ้ำที่เฉพาะเจาะจง บทบาทตัววนซ้ำที่เฉพาะเจาะจงนี้เกี่ยวข้องกับโครงสร้างของคอนเทนเนอร์
ตัวอย่างการใช้งาน Java
แผนภาพชั้นเรียน:
รหัส:
/ ** * อินเทอร์เฟซคอลเลกชันที่กำหนดเองคล้ายกับ java.util.collection * สำหรับการจัดเก็บข้อมูล * @author Stone * */ public Interface icollection <t> {iiterator <t> iterator (); // ส่งคืนโมฆะตัววนซ้ำเพิ่ม (t t); t รับ (INT ดัชนี); - / ** * อินเทอร์เฟซตัววนซ้ำแบบกำหนดเองคล้ายกับ java.util.iterator * ข้อมูลที่ใช้ในการสำรวจคลาสคอลเลกชัน icollection * @author stone * */ อินเทอร์เฟซสาธารณะ iiterator <t> {boolean hasnext (); บูลีน Hasprevious (); t ถัดไป (); ก่อนหน้านี้ (); - / ** * คลาสคอลเลกชันขึ้นอยู่กับ myiterator * @author Stone */ คลาสสาธารณะ mycollection <t> ใช้ icollection <t> {ส่วนตัว t [] arys; ดัชนี int ส่วนตัว = -1; ความจุ int ส่วนตัว = 5; mycollection สาธารณะ () {this.arys = (t []) วัตถุใหม่ [ความจุ]; } @Override iiterator สาธารณะ <T> iterator () {ส่งคืน myiterator ใหม่ <t> (นี่); } @Override โมฆะสาธารณะเพิ่ม (t t) {index ++; if (index == ความจุ) {ความจุ *= 2; this.arys = arrays.copyof (arys, กำลังการผลิต); } this.arys [index] = t; } @Override สาธารณะ t get (int index) {return this.arys [index]; - /** หากมีโครงสร้างการจัดเก็บใหม่คุณสามารถสร้างใหม่ได้ซึ่งสอดคล้องกับ iiterator ใหม่เพื่อใช้งาน traversal*/ @suppresswarnings ({"rawtypes", "unchecked"}) การทดสอบระดับสาธารณะ เพิ่ม (คอลเลกชัน, 3, 5, 8, 12, 3, 3, 5); สำหรับ (iiterator <Integer> iterator = collection.iterator (); iterator.hasnext ();) {system.out.println (iterator.next ()); } system.out.println ("-------------------------"); ICOLLECTION COLLECTION2 = ใหม่ myCollection (); เพิ่ม (Collection2, "A", "B", "C", 3, 8, 12, 3, 5); สำหรับ (iiterator iterator = collection2.iterator (); iterator.hasnext ();) {system.out.println (iterator.next ()); }} คงที่ <t> โมฆะเพิ่ม (icollection <t> c, t ... a) {สำหรับ (t i: a) {c.add (i); -พิมพ์:
3 5 8 12 3 3 5 -------------- ABC 3 8 12 3 5