โหมดผู้เยี่ยมชม: ห่อหุ้มการดำเนินการบางอย่างที่ทำหน้าที่ในแต่ละองค์ประกอบในโครงสร้างข้อมูลบางอย่าง มันสามารถกำหนดการดำเนินการใหม่ที่ดำเนินการกับองค์ประกอบเหล่านี้โดยไม่ต้องเปลี่ยนโครงสร้างข้อมูลนี้ แผนภาพโครงสร้างของโหมดผู้เยี่ยมชมมีดังนี้:
จากภาพด้านบนคุณจะเห็นว่าเขามีตัวละครต่อไปนี้:
บทคัดย่อบทบาทผู้เข้าชม: กำหนดอินเทอร์เฟซและประกาศการดำเนินการเข้าถึงอย่างน้อยหนึ่งรายการ
บทบาทของผู้เข้าชมคอนกรีต: ใช้อินเทอร์เฟซที่ประกาศโดยผู้เข้าชมนามธรรมนั่นคือการดำเนินการเข้าถึงที่หลากหลายที่ประกาศโดยผู้เข้าชมนามธรรม
บทบาทนามธรรม (การมองเห็น) บทบาท: ประกาศการดำเนินการยอมรับโดยยอมรับวัตถุผู้เข้าชมเป็นพารามิเตอร์
บทบาทที่เป็นรูปธรรม: ใช้การดำเนินการยอมรับที่ระบุโดยโหนดนามธรรม
โครงสร้างโครงสร้างวัตถุ (ObjectStructure) บทบาท: มันสามารถสำรวจองค์ประกอบทั้งหมดในโครงสร้างและให้อินเทอร์เฟซสำหรับวัตถุผู้เข้าชมเพื่อเข้าถึงแต่ละองค์ประกอบ
รหัสจำลองมีดังนี้:
ผู้เยี่ยมชมอินเตอร์เฟส {void เยี่ยมชม (gladiolus g); การเยี่ยมชมเป็นโมฆะ (Chrysanthemum C); - // คอนกรีตชื่อผู้เข้าชมการเข้าถึงคลาส StringVisitor ใช้ผู้เข้าชม {String S; สตริงสาธารณะ toString () {return s; } การเยี่ยมชมสาธารณะสาธารณะ (gladiolus g) {s = "gladiolus"; } การเยี่ยมชมสาธารณะ (chrysanteumum c) {s = "chrysanteumum"; - // คลาสผู้เยี่ยมชมคอนกรีต Beevisitor ใช้ผู้เข้าชม {การเยี่ยมชมสาธารณะ (gladiolus g) {system.out.println ("ผึ้งเพื่อเข้าถึง gladiolus"); } การเยี่ยมชมสาธารณะสาธารณะ (Chrysanteum C) {system.out.println ("ผึ้งเพื่อเข้าถึง Chrysanteum"); - อินเทอร์เฟซดอกไม้ {โมฆะยอมรับ (ผู้เยี่ยมชม V); - / * * องค์ประกอบคอนกรีต Chrysanthemum ใช้ดอกไม้ {โมฆะสาธารณะยอมรับ (ผู้เยี่ยมชม V) {v.visit (นี่); - // องค์ประกอบคอนกรีตคลาส Gladiolus ใช้ดอกไม้ {โมฆะสาธารณะยอมรับ (ผู้เยี่ยมชม V) {v.visit (นี่); - // นี่คือตัวสร้างวัตถุดอกไม้ชั้น FlowerGenerator {สุ่มแบบคงที่แบบคงที่ RAND = ใหม่สุ่ม (); ดอกไม้สาธารณะคงที่ newflower () {switch (rand.nextint (2)) {ค่าเริ่มต้น: กรณี 0: ส่งคืน gladiolus ใหม่ (); กรณีที่ 1: ส่งคืน Chrysanthemum ใหม่ (); - การทดสอบคลาสสาธารณะ { / * * ก่อนรับบทบาทผู้เข้าชมเฉพาะกับลูกค้า โครงสร้างวัตถุถูกสำรวจ เรียกวิธีการยอมรับสำหรับแต่ละองค์ประกอบและส่งผ่านบทบาทของผู้เยี่ยมชมเฉพาะสิ่งนี้จะเสร็จสิ้นกระบวนการทั้งหมด*/ โมฆะคงที่สาธารณะหลัก (String args []) {รายการ <later> ดอกไม้ = New ArrayList <WorsINT> (); สำหรับ (int i = 0; i <10; i ++) ดอกไม้ add (flowergenerator.newflower ()); ผู้เยี่ยมชมผู้เข้าชม = ใหม่ StringVisitor (); ตัววนซ้ำ <flower> iterator = flowers.iterator (); ในขณะที่ (iterator.hasnext ()) {iterator.next (). ยอมรับ (ผู้เยี่ยมชม); System.out.println (ผู้เยี่ยมชม); } system.out.println ("-----------------------"); /** พฤติกรรมการเข้าถึงใหม่: Beevisitor Bee Access*/ ผู้เข้าชมผู้เยี่ยมชม 2 = ใหม่ beevisitor (); สำหรับ (ดอกไม้ดอกไม้: ดอกไม้) {Flower.accept (Visitor2); -ผลลัพธ์:
Gladiolus Chrysanthemum Chrysanthemum Gladiolus Chrysanthemum Chrysanthemum Chrysanthemum Chrysanthemum gladiolus gladiolus -
โหมดผู้เยี่ยมชมสามารถพิจารณาได้หาก:
1. โครงสร้างวัตถุมีวัตถุคลาสมากมายและมีอินเทอร์เฟซที่แตกต่างกันและคุณต้องการดำเนินการบางอย่างที่ขึ้นอยู่กับคลาสเฉพาะของพวกเขาในวัตถุเหล่านี้
2. คุณต้องดำเนินการที่แตกต่างกันและไม่เกี่ยวข้องกับวัตถุในโครงสร้างวัตถุและคุณต้องการหลีกเลี่ยงการปล่อยให้การดำเนินการเหล่านี้ "มลพิษ" คลาสของวัตถุเหล่านี้ ผู้เข้าชมช่วยให้คุณมีสมาธิในการดำเนินงานที่เกี่ยวข้องและกำหนดไว้ในชั้นเรียน
3. เมื่อแอปพลิเคชันหลายแอปพลิเคชันใช้ร่วมกันให้ใช้โหมดผู้เยี่ยมชมเพื่อให้แต่ละแอปพลิเคชันมีเฉพาะการดำเนินการที่จำเป็นต้องใช้
4. คลาสที่กำหนดโครงสร้างวัตถุไม่ค่อยเปลี่ยนแปลง แต่การดำเนินการใหม่มักจะต้องใช้เพื่อกำหนดโครงสร้างนี้ การเปลี่ยนคลาสโครงสร้างวัตถุต้องมีการกำหนดอินเทอร์เฟซใหม่ให้กับผู้เข้าชมทั้งหมดซึ่งอาจเป็นค่าใช้จ่ายที่ยิ่งใหญ่ หากคลาสโครงสร้างวัตถุเปลี่ยนแปลงบ่อยครั้งอาจเป็นการดีกว่าที่จะกำหนดการดำเนินการเหล่านี้ในคลาสเหล่านี้
บุคคลเหล่านี้ดูเหมือนจะเป็นคำแนะนำและปัญหาเฉพาะจำเป็นต้องวิเคราะห์ในโครงการ