ขั้นแรกให้วิเคราะห์บทบาททั้งสามในโมเดลพร็อกซีไดนามิก:
1. บทบาทนามธรรม: ในพร็อกซีแบบคงที่สามารถเป็นคลาสนามธรรมได้ แต่ในพร็อกซีไดนามิกสามารถเป็นอินเทอร์เฟซได้เท่านั้น
2. บทบาทที่แท้จริง: เพียงแต่ใช้วิธีการต่างๆ ในบทบาทนามธรรม
3. บทบาทของตัวแทน: สิ่งที่น่ารังเกียจที่สุดคือบทบาทของตัวแทนในไดนามิกเอเจนต์ ควรอ้างอิงถึงตัวละครที่แท้จริง
มันเกี่ยวข้องกับอินเทอร์เฟซและคลาส อินเทอร์เฟซ InvocationHandler และคลาส Proxy ตามเอกสารประกอบของ JDK อินเทอร์เฟซ InvocationHandler ถูกนำมาใช้โดยคลาส และอินสแตนซ์ของคลาสนี้คือออบเจ็กต์ตัวจัดการที่สอดคล้องกับออบเจ็กต์พร็อกซี เมื่อเรียกใช้เมธอดของวัตถุพร็อกซี วิธีการนั้นจะถูกเข้ารหัสและกำหนดให้กับวิธีการเรียกใช้ของวัตถุตัวจัดการที่เกี่ยวข้องเพื่อเรียก!
คัดลอกรหัสรหัสดังต่อไปนี้:
//บทบาทนามธรรม:
อินเทอร์เฟซสาธารณะ AbstractRole
-
การแสดงโมฆะสาธารณะ ();
-
//ตัวละครจริง:
RealRole คลาสสาธารณะใช้ AbstractRole
-
@แทนที่
public void show(){ System.out.println("แสดงบ้านของคุณให้ฉันดู"); }
-
//บทบาทตัวแทน:
//ฉันคิดว่านี่เป็นเพียงตัวแทนหลอก ฉันคิดตัวแทนหลอกขึ้นมาเอง = =! เพราะจริงๆ แล้วมันคือตัวจัดการที่สอดคล้องกับเอเจนต์
ตัวจัดการคลาสสาธารณะใช้ InvocationHandler
-
วัตถุส่วนตัว realRole; // บทบาทพร็อกซีต้องมีการอ้างอิงถึงบทบาทจริง หากถูกกำหนดให้เป็นประเภทวัตถุ จะเป็นสากล
ตัวจัดการสาธารณะ (วัตถุ realRole)
{ นี้.realRole = realRole;
@แทนที่
การเรียกใช้วัตถุสาธารณะ (พร็อกซีวัตถุ, วิธีการวิธีการ, วัตถุ [] args)
-
System.out.println("Give me your money"); // นี่คือฟังก์ชันเพิ่มเติมที่เพิ่มโดยบทบาทตัวแทน
method.invoid(this.realRole, args); //เรียกใช้เมธอดของบทบาทจริงผ่านการสะท้อนกลับ
System.out.println("Ok...house is yours");//นี่เป็นฟังก์ชันเพิ่มเติมที่เพิ่มโดยบทบาทของตัวแทนเอง
-
โรงงานวัตถุสาธารณะ()//สร้างบทบาทตัวแทนจริงผ่านวิธีการโรงงาน
-
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); //เมธอด newProxyInstance ใน Proxy มีคุณสมบัติที่สำคัญสองประการ! สิ่งแรกคือการสร้างคลาสพร็อกซีแบบไดนามิก หากเอาต์พุตดูเหมือนจะเป็นคลาสชื่อ $Proxy0; อย่างที่สองคือการสร้างอินสแตนซ์ผ่านคลาสที่สร้างขึ้นแบบไดนามิก
-
-
//ลูกค้า:
การทดสอบในชั้นเรียนสาธารณะ
-
โมฆะสาธารณะคง main (String [] args)
-
RealRole realRole = new RealRole();//บทบาทจริงใดที่คุณต้องการนำเสนอ เพียงสร้างบทบาทจริงใหม่
Handler handler = new Handler(realRole);//ตัวจัดการที่สอดคล้องกับคลาสพร็อกซีถูกสร้างขึ้นที่นี่ ฉันยังต้องการเรียกมันว่าวัตถุหลอก
AbstractRole proxy = (AbstractRole)handler.factory();//สร้างวัตถุพร็อกซีผ่านวิธีการจากโรงงาน
-
-
คุณอาจสงสัยว่าบทบาทตัวแทนที่นี่สามารถถูกบังคับให้แปลงเป็นบทบาทนามธรรมได้อย่างไร เหตุผลอยู่ในเมธอด newProxyInstance วิธีการนี้น่าสนใจเกินไป ดังที่กล่าวไว้ข้างต้น มันจะสร้างคลาสโดยอัตโนมัติ จากนั้นสร้างอ็อบเจ็กต์พร็อกซีผ่านคลาส ที่จริงแล้วคลาสนี้ใช้คลาสบทบาทนามธรรมเพราะเหตุใด เนื่องจากพารามิเตอร์ตัวที่สองได้ระบุแล้วว่าจะใช้อินเทอร์เฟซใด ดังนั้นคุณจึงสามารถบังคับการถ่ายโอนได้ หลังจากแรงถ่ายโอน คุณสามารถเรียกวิธีการในบทบาทนามธรรมได้
proxy.show();//เอาล่ะ! ให้ความสนใจกับประโยคนี้ ฉันทำเครื่องหมายไว้เป็นสีแดงที่จุดเริ่มต้น "วิธีนี้จะถูกเข้ารหัสและกำหนดให้กับวิธีการเรียกใช้ของวัตถุตัวจัดการที่เกี่ยวข้องเพื่อเรียก!" เนื่องจากประโยคนี้ proxy.show() วิธีการแสดงคือ ส่งผ่านไปยังวิธีการเรียกใช้ในวัตถุตัวจัดการ แน่นอนว่าพารามิเตอร์ของวิธีการแสดงก็ถูกติดตามเช่นกัน แต่วิธีการแสดงที่นี่ไม่มีพารามิเตอร์ ดังนั้นประโยค proxy.show() จึงเรียกใช้เมธอดการเรียกใช้ในออบเจ็กต์ตัวจัดการจริงๆ