บทความนี้อธิบายถึงโหมดพร็อกซีแบบไดนามิกของรูปแบบการออกแบบ Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
โหมดพร็อกซีแบบคงที่ได้รับการแนะนำก่อนหน้านี้และพร็อกซีแบบไดนามิกมีประสิทธิภาพมากกว่าโหมดพร็อกซีแบบคงที่ มันสามารถสร้างวัตถุพร็อกซีแบบไดนามิกเมื่อโปรแกรมทำงาน คลาสพร็อกซีแบบไดนามิกที่เรียกว่าเป็นคลาสที่สร้างขึ้นเมื่อรันไทม์ เมื่อสร้างมันขึ้นมาคุณต้องจัดเตรียมชุดอินเทอร์เฟซให้กับมันและคลาสพร็อกซีแบบไดนามิกอ้างว่าใช้อินเทอร์เฟซเหล่านี้ แน่นอนคลาสพร็อกซีแบบไดนามิกทำหน้าที่เป็นพร็อกซี คุณไม่พยายามช่วยคุณทำงานที่สำคัญ เมื่อสร้างอินสแตนซ์คุณต้องจัดหาตัวจัดการและจะใช้เวลามากกว่างานจริง
บทบาทของพร็อกซีแบบไดนามิกนั้นเหมือนกับพร็อกซีแบบคงที่:
①บทบาทนามธรรม: อินเทอร์เฟซทั่วไประหว่างวัตถุจริงและวัตถุพร็อกซี สิ่งที่ต้องทำในการประกาศวัตถุจริงและวัตถุพร็อกซี
②บทบาทที่แท้จริง: ใช้บทบาทนามธรรมกำหนดตรรกะทางธุรกิจที่จะดำเนินการโดยบทบาทที่แท้จริงและถูกเรียกโดยบทบาทพร็อกซี
③บทบาทพร็อกซีแบบไดนามิก: อินเทอร์เฟซ InvocationHandler จะต้องดำเนินการและใช้วิธีการเรียกใช้ พร็อกซีแบบไดนามิกรู้สึกว่ามีการอ้างอิงประเภทวัตถุซึ่งบ่งบอกถึงบทบาทที่ต้องใช้พร็อกซีแบบไดนามิก กำหนดเป็นประเภทวัตถุซึ่งหมายความว่าวัตถุประเภทใด ๆ สามารถเป็นพร็อกซีแบบไดนามิกได้
นี่คือตัวอย่างโค้ดง่ายๆของรูปแบบพร็อกซีแบบไดนามิกที่เรียบง่าย:
1. บทคัดย่อบทบาท : อินเทอร์เฟซทั่วไประหว่างวัตถุจริงและวัตถุพร็อกซี สิ่งที่ต้องทำในการประกาศวัตถุจริงและวัตถุพร็อกซี
แพ็คเกจ com.tydic.dynamicproxy; หัวเรื่องสาธารณะ {คำขอโมฆะสาธารณะ ();};2. บทบาทที่แท้จริง : ต้องดำเนินการบทบาทนามธรรมซึ่งเป็นวัตถุที่จะพร็อกซี
แพ็คเกจ com.tydic.dynamicproxy; Public Class RealSubject ใช้หัวข้อ {@Override Public Void Request () {System.out.println ("จากเรื่องจริง!"); - 3. บทบาทพร็อกซีแบบไดนามิก : คุณต้องใช้อินเตอร์เฟส InvocationHandler และเขียนวิธีการเรียกใช้ในอินเตอร์เฟส public Object invoke(Object proxy, Method method, Object[] args) เมธอด Invoke มีพารามิเตอร์สามตัว พารามิเตอร์พารามิเตอร์หมายถึงคลาสพร็อกซีวิธีการแสดงถึงวิธีพร็อกซี, ARGS เป็นอาร์เรย์พารามิเตอร์ในเมธอดและวัตถุค่าส่งคืนเป็นค่าที่ส่งคืนโดยการเรียกวิธีการของอินสแตนซ์พร็อกซี วิธีนามธรรมนี้ถูกนำไปใช้แบบไดนามิกในคลาสพร็อกซี
แพ็คเกจ com.tydic.dynamicproxy; นำเข้า java.lang.reflect.invocationhandler นำเข้า java.lang.reflect.method; Dynamicsubject ระดับสาธารณะใช้การใช้งาน {วัตถุส่วนตัวย่อย; // ตัวแทนไดนามิกสาธารณะ } @Override Object Public Invoke (Object Proxy, Method Method, Object [] args) โยน {system.out.println ("ก่อนโทร:" + วิธี); // สามารถเพิ่มฟังก์ชั่นก่อนและหลังวิธีการพร็อกซีวิธีการ invoke (sub, args); System.out.println ("หลังจากโทร:" + วิธี); คืนค่า null; - 4. เขียนรหัสไคลเอนต์ : จำเป็นต้องมีคลาสพร็อกซี คลาสหลักของคลาสพร็อกซีแบบไดนามิกทั้งหมดของคลาสพร็อกซีซึ่งให้วิธีการคงที่สำหรับการสร้างคลาสพร็อกซีแบบไดนามิกและอินสแตนซ์ คลาสพร็อกซีมีวิธีการคง public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) พารามิเตอร์แรกแสดงถึงคลาสโหลดเดอร์ของคลาสพร็อกซีแบบไดนามิกที่สองคืออาร์เรย์คลาสของอินเทอร์เฟซที่คลาสพร็อกซีแบบไดนามิกควรใช้งานและพารามิเตอร์ที่สามคือวัตถุ InvocationHandler เมื่อพร็อกซีแบบไดนามิกเรียกวิธีการที่ต้องการพร็อกซีวิธีการเรียกใช้ของวัตถุ InvocationHandler จะถูกเรียก
แพ็คเกจ com.tydic.dynamicproxy; นำเข้า java.lang.reflect.proxy; ไคลเอนต์ระดับสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {หัวเรื่องหัวเรื่อง = ใหม่ realsubject (); dynamicsUbject handle = new dynamicsUbject (หัวเรื่อง); // การสร้างวัตถุพร็อกซีแบบไดนามิกหัวเรื่องย่อย = (หัวเรื่อง) Proxy.newProxyInstance (DynamicsUbject.class.getClassLoader (), subject.getClass (). getInterfaces (), handle); Sub.Request (); // วิธีการของการจับที่เรียกว่าจริง ๆ เรียกว่า}}สำหรับเนื้อหาที่เกี่ยวข้องกับ Java ผู้อ่านที่สนใจในเว็บไซต์นี้สามารถดูหัวข้อ: "บทนำและการสอนขั้นสูงเกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ Java", "การสอนเกี่ยวกับโครงสร้างข้อมูล Java และอัลกอริทึม" สรุปการดำเนินงานของ Java
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน