23 รูปแบบการออกแบบบทที่ 16: รูปแบบผู้เยี่ยมชม Java
คำจำกัดความ: ห่อหุ้มการดำเนินการบางอย่างที่ดำเนินการกับแต่ละองค์ประกอบในโครงสร้างข้อมูลที่แน่นอน มันสามารถกำหนดการดำเนินการใหม่ที่ดำเนินการกับองค์ประกอบเหล่านี้โดยไม่ต้องเปลี่ยนโครงสร้างข้อมูล
ประเภท: รูปแบบพฤติกรรม
แผนภาพชั้นเรียน:
โหมดผู้เยี่ยมชมอาจเป็นโหมดที่ซับซ้อนที่สุดในโหมดพฤติกรรม แต่นี่อาจเป็นเหตุผลว่าทำไมเราไม่เชี่ยวชาญ
ก่อนอื่นให้ดูตัวอย่างง่ายๆรหัสมีดังนี้
คลาส A {โมฆะสาธารณะวิธีการ 1 () {system.out.println ("ฉันเป็น"); } โมฆะสาธารณะวิธีการ 2 (b b) {b.showa (นี่); }} คลาส B {โมฆะสาธารณะ showa (a a) {a.method1 (); -ลองมาดูกันว่าอะไรคือความแตกต่างระหว่างวิธีการที่ 1 และวิธีการ 2 ในคลาส A วิธีการวิธีการที่ง่ายมากเพียงแค่พิมพ์ประโยค "ฉันเป็น"; Method Method2 นั้นซับซ้อนกว่าเล็กน้อยใช้คลาส B เป็นพารามิเตอร์และเรียกใช้วิธี showa ของคลาส B
ลองมาดูวิธีการ showa ของคลาส B วิธีการ showa ใช้คลาส A เป็นพารามิเตอร์จากนั้นเรียกใช้เมธอด 1 ของคลาส A คุณจะเห็นว่าวิธีการ Method2 เป็นเพียงวิธีการใช้วิธีการของตัวเอง ผลการทำงานของมันควรเป็น "ฉันเป็น" หลังจากการวิเคราะห์ให้เรียกใช้สองวิธีนี้และดูผลการดำเนินการ:
การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {a = ใหม่ a (); A.Method1 (); A.Method2 (ใหม่ b ()); -ผลการทำงานคือ:
ฉันเป็น
ฉันเป็น
หลังจากทำความเข้าใจตัวอย่างนี้คุณจะเข้าใจ 90% ของรูปแบบของผู้เข้าชม ในตัวอย่างสำหรับคลาส A, คลาส B เป็นผู้เยี่ยมชม อย่างไรก็ตามตัวอย่างนี้ไม่ใช่โหมดผู้เยี่ยมชมทั้งหมด แม้ว่ามันจะใช้งานง่าย แต่ก็มีความสามารถในการปรับขนาดได้ไม่ดี มาพูดคุยเกี่ยวกับการใช้งานทั่วไปของโหมดผู้เข้าชม คุณสามารถดูผ่านแผนภาพคลาสที่ในโหมดผู้เยี่ยมชมบทบาทต่อไปนี้ส่วนใหญ่จะรวมอยู่ด้วย:
บทคัดย่อผู้เยี่ยมชม: คลาสนามธรรมหรืออินเทอร์เฟซที่ประกาศว่าองค์ประกอบใดที่ผู้เข้าชมสามารถเข้าถึงได้ โดยเฉพาะในโปรแกรมพารามิเตอร์ในวิธีการเยี่ยมชมกำหนดวัตถุที่สามารถเข้าถึงวัตถุได้
ผู้เข้าชม: ใช้วิธีการที่ประกาศโดยผู้เข้าชมที่เป็นนามธรรมซึ่งส่งผลกระทบต่อสิ่งที่ผู้เข้าชมควรทำและสิ่งที่ควรทำหลังจากเข้าถึงชั้นเรียน
Abstract Element Class: อินเทอร์เฟซหรือคลาสนามธรรมที่ประกาศประเภทของการเข้าถึงผู้เข้าชมที่ยอมรับได้ โปรแกรมถูกกำหนดผ่านพารามิเตอร์ในวิธีการยอมรับ โดยทั่วไปมีวิธีการสองประเภทสำหรับองค์ประกอบที่เป็นนามธรรมอย่างใดอย่างหนึ่งคือตรรกะทางธุรกิจของตัวเองและอีกวิธีหนึ่งคือประเภทของผู้เข้าชมที่ได้รับอนุญาตให้เข้าถึง
คลาสองค์ประกอบ: ใช้วิธีการยอมรับที่ประกาศโดยคลาสองค์ประกอบนามธรรมมักจะผู้เยี่ยมชมเยี่ยมชม (นี้) และโดยทั่วไปได้สร้างสูตรคงที่
วัตถุโครงสร้าง: โดยทั่วไปแล้วคอนเทนเนอร์องค์ประกอบมีคอนเทนเนอร์ที่รองรับคลาสและอินเทอร์เฟซที่แตกต่างกันหลายรายการเช่นรายการชุดแผนที่ ฯลฯ บทบาทนี้ไม่ค่อยเป็นนามธรรมในโครงการ
การใช้งานรหัสทั่วไปของโหมดผู้เยี่ยมชม
องค์ประกอบระดับบทคัดย่อ {โมฆะนามธรรมสาธารณะยอมรับ (ผู้เยี่ยมชม ivisitor); บทคัดย่อสาธารณะเป็นโมฆะ Dosomething (); } อินเตอร์เฟส ivisitor {การเยี่ยมชมสาธารณะ (ConcreteElement1 EL1); การเยี่ยมชมสาธารณะ (Concreteelement2 EL2); } คลาส ConcreteElement1 ขยายองค์ประกอบ {โมฆะสาธารณะ dosomething () {system.out.println ("นี่คือองค์ประกอบ 1"); } โมฆะสาธารณะยอมรับ (ผู้เยี่ยมชม ivisitor) {ผู้เยี่ยมชม Visitor.visit (นี่); }} คลาส ConcreteElement2 ขยายองค์ประกอบ {โมฆะสาธารณะ dosomething () {system.out.println ("นี่คือองค์ประกอบ 2"); } โมฆะสาธารณะยอมรับ (ผู้เยี่ยมชม ivisitor) {ผู้เยี่ยมชม Visitor.visit (นี่); }} ผู้เยี่ยมชมคลาสใช้ ivisitor {การเยี่ยมชมสาธารณะ (ConcreteElement1 EL1) {El1.dosomething (); } การเยี่ยมชมสาธารณะ (ConcreteElement2 EL2) {El2.dosomething (); }} คลาส ObjectStruture {รายการคงที่สาธารณะ <Element> getList () {รายการ <Element> list = new ArrayList <Element> (); สุ่มวิ่ง = ใหม่สุ่ม (); สำหรับ (int i = 0; i <10; i ++) {int a = ran.nextint (100); if (a> 50) {list.add (คอนกรีตใหม่ 1 ()); } else {list.add (คอนกรีตใหม่ 2 ()); }} รายการส่งคืน; }} ไคลเอนต์คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {รายการ <ส่วนประกอบ> list = objectStruture.getList (); สำหรับ (องค์ประกอบ e: รายการ) {e.accept (ผู้เยี่ยมชมใหม่ ()); - ข้อดีของโหมดผู้เยี่ยมชม
ปฏิบัติตามหลักการของความรับผิดชอบเดี่ยว: ในสถานการณ์ใด ๆ ที่โหมดผู้เข้าชมใช้งานได้การดำเนินการที่ต้องห่อหุ้มในผู้เข้าชมในคลาสองค์ประกอบจะต้องดำเนินการที่มีส่วนเกี่ยวข้องกับคลาสองค์ประกอบเพียงเล็กน้อยและมีความผันผวน ในอีกด้านหนึ่งการใช้โหมดผู้เยี่ยมชมเป็นไปตามหลักการของความรับผิดชอบเดี่ยวและในทางกลับกันเนื่องจากการดำเนินการที่ห่อหุ้มอยู่มักจะผันผวนเมื่อมีการเปลี่ยนแปลงเกิดขึ้นการขยายตัวของส่วนที่เปลี่ยนแปลงสามารถทำได้โดยไม่ต้องเปลี่ยนคลาสองค์ประกอบเอง
ความสามารถในการปรับขนาดที่ดี: คลาสองค์ประกอบสามารถขยายการดำเนินงานที่แตกต่างกันโดยยอมรับผู้เข้าชมที่แตกต่างกัน
สถานการณ์ที่เกี่ยวข้องสำหรับโหมดผู้เข้าชม
หากมีการดำเนินการบางอย่างในวัตถุที่ไม่เกี่ยวข้องกับวัตถุ (หรือที่เกี่ยวข้องอย่างอ่อนแอ) และเพื่อหลีกเลี่ยงการดำเนินการเหล่านี้ที่ปนเปื้อนวัตถุคุณสามารถใช้โหมดผู้เข้าชมเพื่อห่อหุ้มการดำเนินการเหล่านี้ลงในผู้เข้าชม
หากมีการดำเนินการที่คล้ายกันในกลุ่มวัตถุเพื่อหลีกเลี่ยงรหัสซ้ำจำนวนมากการดำเนินการซ้ำเหล่านี้ยังสามารถห่อหุ้มเข้าไปในผู้เข้าชมได้
อย่างไรก็ตามโหมดผู้เยี่ยมชมไม่สมบูรณ์แบบและยังมีข้อบกพร่องร้ายแรง: การเพิ่มคลาสองค์ประกอบใหม่นั้นยากกว่า ผ่านรหัสของรูปแบบผู้เข้าชมเราจะเห็นได้ว่าในคลาสผู้เข้าชมแต่ละคลาสองค์ประกอบมีวิธีการประมวลผลที่สอดคล้องกัน กล่าวคือแต่ละคลาสองค์ประกอบจะต้องถูกเพิ่มเพื่อปรับเปลี่ยนคลาสผู้เข้าชม (รวมถึงคลาสย่อยหรือคลาสการใช้งานของคลาสผู้เยี่ยมชม) ซึ่งค่อนข้างลำบากในการแก้ไข กล่าวคือเมื่อจำนวนคลาสองค์ประกอบไม่แน่นอนโหมดผู้เข้าชมควรใช้ด้วยความระมัดระวัง ดังนั้นโหมดผู้เยี่ยมชมจึงเหมาะสำหรับการปรับแต่งฟังก์ชั่นที่มีอยู่ใหม่ ตัวอย่างเช่นหากมีการกำหนดฟังก์ชั่นพื้นฐานของโครงการข้อมูลของคลาสองค์ประกอบจะถูกกำหนดโดยทั่วไปและจะไม่เปลี่ยนแปลง สิ่งที่จะเปลี่ยนแปลงคือการดำเนินการที่เกี่ยวข้องภายในองค์ประกอบเหล่านี้ ในเวลานี้เราสามารถใช้โหมดผู้เยี่ยมชมเพื่อ refactor รหัสต้นฉบับเพื่อให้สามารถแก้ไขฟังก์ชั่นดั้งเดิมได้โดยไม่ต้องแก้ไขแต่ละคลาสองค์ประกอบ
สรุป
ในฐานะ GOF ผู้เขียนรูปแบบการออกแบบอธิบายโหมดผู้เยี่ยมชม: ในกรณีส่วนใหญ่คุณต้องใช้โหมดผู้เยี่ยมชม แต่เมื่อคุณต้องการคุณต้องการมันจริงๆ แน่นอนว่านี่เป็นเพียงสำหรับผู้ชายที่ยิ่งใหญ่ที่แท้จริง ในความเป็นจริง (อย่างน้อยในสภาพแวดล้อมที่ฉันอยู่) หลายคนมักจะติดกับรูปแบบการออกแบบ เมื่อใช้รูปแบบการออกแบบพวกเขาไม่เคยพิจารณาอย่างจริงจังว่ารูปแบบที่พวกเขาใช้นั้นเหมาะสำหรับสถานการณ์นี้หรือไม่ แต่มักจะต้องการแสดงความสามารถในการควบคุมการออกแบบเชิงวัตถุ หากคุณมีความคิดนี้เมื่อเขียนโปรแกรมคุณมักจะใช้รูปแบบการออกแบบที่ใช้ในทางที่ผิด ดังนั้นเมื่อเรียนรู้รูปแบบการออกแบบคุณต้องเข้าใจการบังคับใช้ของรูปแบบ จำเป็นต้องใช้รูปแบบเพราะคุณเข้าใจข้อดีของมันไม่ต้องใช้รูปแบบเพราะคุณเข้าใจข้อเสียของมัน แทนที่จะใช้รูปแบบเพราะคุณไม่เข้าใจข้อเสียของมันไม่ใช้รูปแบบเพราะคุณไม่เข้าใจข้อดีของมัน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น