การจัดส่งสองครั้ง
การกระจายคู่คืออะไร?
เมื่อพูดถึงการเขียนโปรแกรมเชิงวัตถุเรามักจะพูดถึง "polymorphism" เชิงวัตถุ ในหมู่พวกเขามักจะมีการพูดเกี่ยวกับ polymorphism ว่า "การอ้างอิงระดับผู้ปกครองชี้ไปที่วัตถุระดับเด็ก"
การอ้างอิงคลาสหลักนี้ชี้ไปที่วัตถุ subclass ถูกเขียนขึ้นดังต่อไปนี้:
สัตว์สัตว์ = สุนัขตัวใหม่ (); Animal.bark ();
อีกรูปแบบที่ใช้กันทั่วไปคือ
ผู้ดูแลชั้นเรียนสาธารณะ {โมฆะสาธารณะพูดว่า (สัตว์ A) {System.out.println ("Animal Say"); } โมฆะสาธารณะพูดว่า (สุนัขสุนัข) {System.out.println ("Dog Says"); }} สัตว์สัตว์ = สัตว์ใหม่ (); สุนัขสัตว์ = สุนัขตัวใหม่ (); Keeper Keeper = New Keeper (); Keeper.Say (สัตว์); Keep.Say (DOG); เนื้อหาใดจะถูกส่งออกเมื่อผู้ดูแลด้านบนเรียกว่าสองครั้ง? สองวิธีที่แตกต่างกันจะถูกเรียกหรือไม่?
ในความเป็นจริงในระหว่างการโทรทั้งสองวิธีนี้จะเรียกว่า (สัตว์ A) จะถูกเรียก เนื่องจากเนื้อหาเหล่านี้สามารถพบได้ในช่วงเวลาการรวบรวมนี่คือการกระจายแบบคงที่ของ Java
จากรูปด้านบนเราจะเห็นว่าไบต์ที่สร้างขึ้นโดยการโทรสองครั้งจะชี้ไปที่วิธีการพูด (สัตว์ A) วิธีการดำเนินการโดยตรงเมื่อรันไทม์และเนื้อหาที่เกี่ยวข้องจะถูกส่งออก
ทำไมสัตว์ที่สอดคล้องกัน bark () ถึงการเรียกวิธีการของชั้นสุนัข? นี่คือการกำหนดประเภทของผู้รับวิธีเฉพาะที่รันไทม์และดำเนินการ สิ่งนี้เรียกว่าการแจกแจงแบบไดนามิกซึ่งกำหนดวิธีการเฉพาะที่รันไทม์และดำเนินการ polymorphism เชิงวัตถุ
การส่ง
การกระจายหมายถึงกระบวนการของการสรุปวิธีการที่จะดำเนินการ
สำหรับภาษาคงที่เช่น Java พวกเขาทั้งหมดถูกดำเนินการผ่านการแจกแจงครั้งเดียว (การจัดส่งครั้งเดียว)
ตัวอย่างเช่นบรรทัดของรหัส
dog.eat(new Bone())
การดำเนินการขั้นสุดท้ายของวิธีการ EAT ที่จะเลือกจะเลือกวิธีการที่สอดคล้องกันตามประเภทเฉพาะของสุนัขและพารามิเตอร์ที่ผ่านไม่สามารถส่งผลกระทบต่อการเลือกวิธีการที่สอดคล้องกัน นี่คือการจัดส่งครั้งเดียว
เพื่อที่จะทำให้พารามิเตอร์จริงผ่านเข้ามากระดูกอยู่ที่นี่เพื่อมีบทบาทจริง ๆ คุณต้องใช้การจัดส่งสองครั้งหรือการจัดส่งหลายครั้ง
กล่าวคือการตัดสินใจขั้นสุดท้ายไม่เพียง แต่เป็นตัวรับสัญญาณของวิธีเท่านั้น แต่ยังรวมถึงประเภทพารามิเตอร์ด้วย
โหมดผู้เยี่ยมชม
ในโหมดการออกแบบของ GOF โหมดผู้เยี่ยมชมใช้การจัดส่งสองครั้งเพื่อให้ได้จุดประสงค์ในการเรียกวัตถุจริง
สำหรับโหมดผู้เยี่ยมชมตัวอย่างที่พบบ่อยที่สุดคือการสำรวจต้นไม้ ตัวอย่างเช่นมีความแตกต่างในการประมวลผลโหนดและใบไม้ สิ่งนี้ทำผ่านการกระจายคู่ของผู้เข้าชมเพื่อใช้องค์ประกอบที่แตกต่างกันและดำเนินการเนื้อหาที่แตกต่างกัน
รหัสมีลักษณะเช่นนี้:
Node.accept (ใหม่ ConcreateVisitor ()); leaf.accept (คอนกรีตใหม่ ());
วิธีการยอมรับในโหนดจะผ่านประเภทจริงกลับไปยังผู้เข้าชมอีกครั้ง
โมฆะสาธารณะยอมรับ (ผู้เข้าชม V) {V.Visit (นี่); -ในเวลานี้ในผู้เข้าชมคุณสามารถเรียกวิธีการเฉพาะตามประเภทจริงและมีวิธีการที่คล้ายกับวิธีที่สอดคล้องกับโหนดและใบไม้:
การเยี่ยมชมสาธารณะ (Node N); การเยี่ยมชมสาธารณะ (Leaf L);
ผู้เข้าชมเพื่อสรุปโดยทั่วไปจะมีส่วนต่อประสานผู้เข้าชม ในอินเทอร์เฟซผู้เข้าชมจะมีตรรกะการประมวลผลของแต่ละวัตถุองค์ประกอบที่จะเข้าถึง ในการใช้งานเฉพาะของแต่ละองค์ประกอบคุณส่งประเภทของคุณเองกลับไปยังผู้เข้าชมสำหรับการแจกแจงรองเพื่อใช้การโทรตรรกะที่แน่นอน
แอปพลิเคชันใน Tomcat
ผู้เยี่ยมชมยังใช้ใน Tomcat โดยทั่วไปจะแยกวิเคราะห์ EL Expressions
ตัวอย่างเช่น org.apache.el.parser.node
คลาสนี้มีวิธีการยอมรับ (ผู้เยี่ยมชม NodeVisitor)
มีโหนดประเภทจริงมากมาย แต่ในช่วงเวลาของการโทรจริงมันจะผ่านไป
โมฆะสาธารณะยอมรับ (ผู้เยี่ยมชม NodeVisitor) โยนข้อยกเว้น {ผู้เยี่ยมชม Visitor.visit (นี่);ผ่านประเภทจริงกลับไปยังผู้เข้าชมวิธีการเฉพาะจะถูกเรียกใน visor เพื่อให้พารามิเตอร์สามารถมีบทบาทเด็ดขาด
การเยี่ยมชมสาธารณะ (โหนดโหนด) พ่น elexception {ถ้า (node instanceof astfunction) {ASTFUNCTION funcNode = (ASTFUNCTION) โหนด; วิธี m = null; } อื่นถ้า (xxx) {} ที่นี่จะมีการประกาศวิธีการเยี่ยมชมหลายวิธีและการเยี่ยมชมข้างต้น (นี้) จะอยู่ในวิธีการเป้าหมายโดยตรง
ข้างต้นเป็นการแจกแจงต่าง ๆ ใน Java และโมเดลผู้เยี่ยมชมเพื่อให้ได้การแจกแจงแบบคู่ผ่านรูปแบบของรูปแบบ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉัน บรรณาธิการจะตอบกลับทุกคนในเวลา!