คำจำกัดความ: จัดเตรียมวิธีการเข้าถึงองค์ประกอบต่าง ๆ ในวัตถุคอนเทนเนอร์โดยไม่เปิดเผยรายละเอียดภายในของวัตถุ
ประเภท: รูปแบบพฤติกรรม
แผนภาพชั้นเรียน:
หากคุณต้องการถามโหมดที่ใช้กันมากที่สุดใน Java คำตอบไม่ใช่โหมด Singleton หรือโหมดโรงงานหรือโหมดกลยุทธ์ แต่เป็นโหมด Iterator มาดูรหัสหนึ่งก่อน:
Public Static Void Print (คอลเลกชัน coll) {iterator it = coll.iterator (); ในขณะที่ (it.hasnext ()) {string str = (string) it.next (); System.out.println (str); - ฟังก์ชั่นของวิธีนี้คือการพิมพ์ลูปคอลเลกชันสตริงและรูปแบบตัววนซ้ำจะใช้ในรูปแบบตัววนซ้ำ ภาษา Java ได้ใช้รูปแบบตัววนซ้ำอย่างสมบูรณ์ ตัววนซ้ำแปลเป็นภาษาจีนหมายถึงตัววนซ้ำ เมื่อพูดถึงตัววนซ้ำก่อนอื่นมันเกี่ยวข้องกับชุด ชุดจะเรียกว่ามวลรวมคอนเทนเนอร์ ฯลฯ เราสามารถพิจารณาชุดเป็นคอนเทนเนอร์ที่สามารถมีวัตถุได้ ตัวอย่างเช่นรายการตั้งค่าแผนที่และแม้กระทั่งอาร์เรย์สามารถเรียกได้ว่าชุด ฟังก์ชั่นของตัววนซ้ำคือการสำรวจวัตถุในคอนเทนเนอร์ทีละตัว
โครงสร้างของรูปแบบตัววนซ้ำ
บทคัดย่อคอนเทนเนอร์: โดยทั่วไปมีวิธีการ iterator () เช่นอินเทอร์เฟซคอลเลกชันอินเตอร์เฟสรายการชุดอินเตอร์เฟส ฯลฯ ใน Java
คอนเทนเนอร์เฉพาะ: มันเป็นคลาสการใช้งานที่เป็นรูปธรรมของคอนเทนเนอร์นามธรรมเช่นรายการที่สั่งซื้อของรายการอินเทอร์เฟซเพื่อใช้งาน ArrayList รายการที่เชื่อมโยงของอินเทอร์เฟซรายการเพื่อใช้งาน LinkList รายการแฮชของอินเทอร์เฟซที่ตั้งไว้เพื่อใช้งาน HashSet ฯลฯ
บทคัดย่อตัววนซ้ำ: กำหนดวิธีที่จำเป็นในการสำรวจองค์ประกอบ โดยทั่วไปการพูดมีสามวิธี: รับวิธีแรก () ขององค์ประกอบแรกรับวิธีถัดไป () ขององค์ประกอบถัดไปตรวจสอบว่าวิธีการ traversal end isdone () (หรือ hasnext ()), ลบ () ของวัตถุปัจจุบันหรือไม่
การใช้งาน Iterator: ใช้วิธีการที่กำหนดไว้ในอินเทอร์เฟซตัววนซ้ำเพื่อทำซ้ำของคอลเลกชันให้เสร็จสมบูรณ์
ยกตัวอย่าง
เนื่องจากกฎระเบียบของโหมดตัววนซ้ำนั้นค่อนข้างหลวมการใช้งานที่เฉพาะเจาะจงจึงมีความหลากหลาย มายกตัวอย่างเพียงตัวอย่างเดียวที่นี่และเราไม่สามารถนำเสนอวิธีการใช้งานทีละวิธี ดังนั้นก่อนที่จะยกตัวอย่างให้แสดงรายการวิธีการใช้งานของรูปแบบตัววนซ้ำถัดไป
1. บทบาทตัววนซ้ำกำหนดอินเทอร์เฟซสำหรับการสำรวจ แต่ไม่ได้ระบุว่าใครเป็นผู้ควบคุมการวนซ้ำ ในแอปพลิเคชันของคอลเลกชัน Java กระบวนการของ Traversal ถูกควบคุมโดยโปรแกรมไคลเอนต์ซึ่งเรียกว่าตัววนซ้ำภายนอก วิธีการใช้งานอีกวิธีหนึ่งคือการควบคุมตัวหมุนเองซึ่งเรียกว่าตัววนซ้ำภายใน ตัววนซ้ำภายนอกมีความยืดหยุ่นและทรงพลังกว่าตัววนซ้ำภายในและตัววนซ้ำภายในนั้นอ่อนแอมากในสภาพแวดล้อมของสถานที่ตั้ง Java
2. ไม่มีข้อกำหนดสำหรับผู้ที่จะใช้อัลกอริทึมการสำรวจในโหมดตัววนซ้ำ ดูเหมือนว่าจะเป็นธรรมชาติที่จะนำไปใช้ในบทบาทตัววนซ้ำ เนื่องจากมันสะดวกสำหรับอัลกอริทึมการเดินทางที่แตกต่างกันที่จะใช้กับภาชนะจึงสะดวกสำหรับการใช้อัลกอริทึมการสำรวจข้ามกับภาชนะที่แตกต่างกัน แต่สิ่งนี้จะทำลายการห่อหุ้มของคอนเทนเนอร์ - บทบาทคอนเทนเนอร์จะต้องเปิดเผยคุณลักษณะส่วนตัวของตัวเองซึ่งใน Java หมายถึงการเปิดเผยคุณสมบัติส่วนตัวของตัวเองไปยังชั้นเรียนอื่น ๆ
ถ้าอย่างนั้นก็นำไปใช้ในบทบาทคอนเทนเนอร์เพื่อนำไปใช้ ด้วยวิธีนี้บทบาทของตัววนซ้ำจะถูกแทนที่เพื่อเก็บฟังก์ชั่นที่ผ่านตำแหน่งปัจจุบันเท่านั้น แต่อัลกอริทึมการสำรวจนั้นเชื่อมโยงกับภาชนะที่เฉพาะเจาะจงอย่างแน่นหนา
ในการประยุกต์ใช้คอลเลกชัน Java บทบาทตัววนซ้ำที่เฉพาะเจาะจงที่ให้ไว้คือคลาสภายในที่กำหนดไว้ในบทบาทคอนเทนเนอร์ สิ่งนี้จะช่วยปกป้องบรรจุภัณฑ์ของคอนเทนเนอร์ แต่ในเวลาเดียวกันคอนเทนเนอร์ยังให้อินเทอร์เฟซอัลกอริทึมการสำรวจและคุณสามารถขยายตัววนซ้ำของคุณเองได้
ตกลงมาดูกันว่าตัววนซ้ำในคอลเลกชัน Java ถูกนำไปใช้อย่างไร
// บทบาทของตัววนซ้ำเพียงกำหนดเฉพาะอินเตอร์เฟสของอินเทอร์เฟซ traversal public iterator {boolean hasnext (); วัตถุถัดไป (); เป็นโมฆะลบ ();} // บทบาทคอนเทนเนอร์นำรายการเป็นตัวอย่างที่นี่ มันเป็นเพียงอินเทอร์เฟซดังนั้นจึงไม่ได้อยู่ในรายการ บทบาทคอนเทนเนอร์เฉพาะคือ ArrayList และคลาสอื่น ๆ ที่ใช้อินเตอร์เฟสรายการ เพื่อเน้นประเด็นสำคัญเราอ้างถึงเนื้อหาที่เกี่ยวข้องกับตัววนซ้ำ // บทบาทตัววนซ้ำที่เฉพาะเจาะจงนั้นได้มาในรูปแบบของคลาสภายใน AbstractList มีอยู่เพื่อสกัดส่วนที่พบบ่อยของแต่ละบทบาทคอนเทนเนอร์เฉพาะ บทคัดย่อสาธารณะบทคัดย่อบทคัดย่อขยายรายการ AbstractCollection onprements {... // นี่คือวิธีการโรงงานที่รับผิดชอบในการสร้าง Iterator Iterator Public Public Iterator () {ส่งคืน ITR ใหม่ ();} // เป็นบทบาทที่เฉพาะเจาะจงของ ITR ภายในคลาส ITR int lastret = -1; int คาดหวัง modCount = modCount; บูลีนสาธารณะ hasnext () {กลับเคอร์เซอร์! = size (); } วัตถุสาธารณะ next () {checkforcomodification (); ลอง {object next = get (เคอร์เซอร์); Lastret = เคอร์เซอร์ ++; กลับมาถัดไป; } catch (indexoutofboundsexception e) {checkforcomodification (); โยน nosuchelementexception ใหม่ (); }} โมฆะสาธารณะลบ () {ถ้า (LASTRET == -1) โยน unlueLstateException ใหม่ (); checkforcomodification (); ลอง {Abstractlist.his.remove (Lastret); ถ้าเคอร์เซอร์ (Lastret <เคอร์เซอร์)-; Lastret = -1; คาดว่า ModCount = ModCount; } catch (indexoutofboundsexception e) {โยนใหม่พร้อมกันใหม่ Exception (); }} void สุดท้าย checkForComodification () {ถ้า (modcount! = คาดหวัง modcount) โยนใหม่พร้อมกัน modificationException (); -สำหรับการใช้โหมดตัววนซ้ำ ตามที่ระบุไว้ในบทนำโปรแกรมลูกค้าจะต้องได้รับบทบาทคอนเทนเนอร์เฉพาะก่อนจากนั้นรับบทบาทตัววนซ้ำที่เฉพาะเจาะจงผ่านบทบาทคอนเทนเนอร์ที่เฉพาะเจาะจง ด้วยวิธีนี้คุณสามารถใช้บทบาทของตัววนซ้ำที่เฉพาะเจาะจงในการสำรวจคอนเทนเนอร์ ...
ข้อดีและข้อเสียของโหมดตัววนซ้ำ
ข้อดีของโหมดตัววนซ้ำคือ:
วิธีการสำรวจนั้นง่ายขึ้นและยังคงลำบากในการสำรวจการรวบรวมวัตถุ สำหรับอาร์เรย์หรือรายการที่สั่งซื้อเรายังสามารถรับพวกเขาผ่านเคอร์เซอร์ แต่ผู้ใช้จำเป็นต้องสำรวจวัตถุด้วยตัวเองในหลักฐานว่าพวกเขามีความเข้าใจที่ชัดเจนเกี่ยวกับคอลเลกชัน อย่างไรก็ตามสำหรับตารางแฮชมันเป็นเรื่องยากที่จะสำรวจผู้ใช้ หลังจากแนะนำวิธีการวนซ้ำมันจะง่ายกว่าสำหรับผู้ใช้ที่จะใช้
มีหลายวิธีในการสำรวจเช่นสำหรับรายการที่สั่งซื้อเราสามารถจัดหาผู้วนซ้ำสองคนด้วยคำสั่งซื้อในเชิงบวกและย้อนกลับตามลำดับตามความต้องการ ผู้ใช้จะต้องได้รับตัววนซ้ำที่เรานำไปใช้เพื่อสำรวจคอลเลกชันได้อย่างง่ายดาย
การห่อหุ้มเป็นสิ่งที่ดีและผู้ใช้จะต้องได้รับตัววนซ้ำเพื่อสำรวจ แต่พวกเขาไม่ต้องกังวลเกี่ยวกับอัลกอริทึมการสำรวจ
ข้อเสียของรูปแบบตัววนซ้ำ:
สำหรับการเดินทางแบบง่าย ๆ (เช่นอาร์เรย์หรือรายการที่สั่งซื้อ) มันยุ่งยากมากกว่าที่จะใช้ตัววนซ้ำและทุกคนอาจรู้สึกว่าเช่น ArrayList เราจะใช้ลูปและรับวิธีการสำรวจคอลเลกชัน
สถานการณ์ที่ใช้งานได้สำหรับโหมดตัววนซ้ำ
รูปแบบตัววนซ้ำเป็น symbiotic และความตายด้วยคอลเลกชัน โดยทั่วไปการพูดตราบใดที่เราใช้คอลเลกชันเราจำเป็นต้องจัดเตรียมตัววนซ้ำของคอลเลกชันในเวลาเดียวกันเช่นคอลเลกชันรายการชุดแผนที่ ฯลฯ ในชวาคอลเลกชันเหล่านี้มีตัววนซ้ำของตัวเอง หากเราต้องการใช้คอนเทนเนอร์ใหม่นี้แน่นอนว่าเราต้องแนะนำรูปแบบตัววนซ้ำเพื่อใช้ตัววนซ้ำสำหรับคอนเทนเนอร์ของเรา
อย่างไรก็ตามเนื่องจากความสัมพันธ์ระหว่างคอนเทนเนอร์และตัววนซ้ำอยู่ใกล้เกินไปภาษาส่วนใหญ่จึงให้ตัววนซ้ำเมื่อใช้คอนเทนเนอร์และคอนเทนเนอร์และตัววนซ้ำที่ได้รับจากภาษาเหล่านี้สามารถตอบสนองความต้องการของเราในกรณีส่วนใหญ่ ดังนั้นจึงเป็นเรื่องยากที่จะฝึกฝนรูปแบบตัววนซ้ำด้วยตัวเอง เราต้องใช้คอนเทนเนอร์ที่มีอยู่และตัววนซ้ำในภาษาเท่านั้น