แนวคิด
โหมดพร็อกซี: โหมดพร็อกซีเป็นคลาสพร็อกซีพิเศษเพื่อดำเนินการบางอย่างในวัตถุดั้งเดิม ตัวอย่างเช่นบางครั้งเราจำเป็นต้องจ้างทนายความเมื่อเราไปที่คดีเพราะทนายความมีความเชี่ยวชาญด้านกฎหมายและสามารถดำเนินการและแสดงความคิดของเราสำหรับเรา นี่คือความหมายของเอเจนซี่ โหมดพร็อกซีแบ่งออกเป็นสองประเภท: 1. พร็อกซีแบบคงที่ (ไม่ใช้วิธีการใน JDK); 2. พร็อกซีแบบไดนามิก (ใช้ InvocationHandler และพร็อกซีใน JDK)
พร็อกซีแบบคงที่ถูกสร้างขึ้นโดยโปรแกรมเมอร์หรือเครื่องมือในการสร้างซอร์สโค้ดของคลาสพร็อกซีจากนั้นรวบรวมคลาสพร็อกซี สิ่งที่เรียกว่าแบบคงที่หมายความว่าไฟล์ bytecode ของคลาสพร็อกซีมีอยู่แล้วก่อนที่โปรแกรมจะทำงานและความสัมพันธ์ระหว่างคลาสพร็อกซีและคลาสตัวแทนจะถูกกำหนดก่อนที่จะทำงาน
ซอร์สโค้ดของคลาสพร็อกซีแบบไดนามิกถูกสร้างขึ้นแบบไดนามิกโดย JVM ตามการสะท้อนและกลไกอื่น ๆ ในระหว่างการดำเนินการโปรแกรมดังนั้นจึงไม่มีไฟล์ไบต์ของคลาสพร็อกซี ความสัมพันธ์ระหว่างคลาสพร็อกซีและคลาสตัวแทนจะถูกกำหนดเมื่อโปรแกรมทำงาน
ตัวอย่าง
ที่นี่เรายกตัวอย่างของพร็อกซีแบบคงที่:
แผนภาพชั้นเรียน:
/ *** อินเทอร์เฟซเกมเมอร์**/ อินเตอร์เฟสสาธารณะ igameplayer {// เข้าสู่ระบบเข้าสู่การเข้าสู่ระบบของเกมเป็นโมฆะสาธารณะ (ผู้ใช้สตริง, รหัสผ่านสตริง); // Kill Monsters คุณลักษณะหลักของเกมออนไลน์โมฆะสาธารณะ Killboss (); // อัพเกรดโมฆะสาธารณะอัพเกรด (); - / *** Gamer**/ Public Class GamePlayer ใช้ igamePlayer {ชื่อสตริงส่วนตัว = ""; // ส่งชื่อผ่านตัวสร้างเกมสาธารณะ (สตริง _name) {this.name = _name; } // เมื่อต่อสู้กับสัตว์ประหลาดสิ่งที่คาดหวังมากที่สุดคือการฆ่าโมฆะสาธารณะมอนสเตอร์โมฆะ Killboss () {System.out.println (this.name + "Kill Monsters!"); } // คุณต้องเข้าสู่ระบบก่อนเข้าเกม นี่เป็นเงื่อนไขที่จำเป็น การเข้าสู่ระบบโมฆะสาธารณะ (ผู้ใช้สตริง, รหัสผ่านสตริง) {System.out.println ("ชื่อเข้าสู่ระบบคือ" + ผู้ใช้ + "บทบาท" + this.name + "เข้าสู่ระบบได้สำเร็จ!"); } // การอัพเกรดมีหลายวิธีในการอัพเกรดใช้จ่ายเงินเพื่อซื้อและการทำงานเป็นโมฆะแบบสาธารณะ () {system.out.println (this.name + "อีกระดับหนึ่ง!"); - /*** ลูกค้าไม่สามารถมองเห็นวัตถุพร็อกซี*/การเล่นเกมระดับสาธารณะโดยใช้ igameplayer {private igameplayer gameplayer = null; // พร็อกซีออบเจ็กต์ // ผ่านตัวสร้างที่จะฝึกเล่นเกม } // ผู้รับการฆ่ามอนสเตอร์โมฆะสาธารณะ Killboss () {this.gameplayer.killboss (); } // ผู้รับเข้าสู่ระบบล็อกอินสาธารณะเข้าสู่ระบบ (ผู้ใช้สตริง, รหัสผ่านสตริง) {this.gameplayer.login (ผู้ใช้, รหัสผ่าน); } // ฝึกอัพเกรดโมฆะการอัพเกรดสาธารณะ () {this.gameplayer.upgrade (); - /** ลูกค้าไม่สามารถมองเห็นได้จากวัตถุพร็อกซี*/เกมระดับสาธารณะ GamePlayerProxy2 ใช้ igameplayer {private igameplayer gameplayer = null; // พร็อกซีออบเจ็กต์ // ผ่านตัวสร้างเกม } // ผู้รับฆ่ามอนสเตอร์โมฆะสาธารณะ Killboss () {this.gameplayer.killboss (); } // ผู้รับเข้าสู่ระบบการเข้าสู่ระบบสาธารณะ (ผู้ใช้สตริง, รหัสผ่านสตริง) {system.out.println ("localestring ()"); this.gameplayer.login (ผู้ใช้, รหัสผ่าน); } // ฝึกอัพเกรด () การอัพเกรดโมฆะสาธารณะ () {this.gameplayer.upgrade (); System.out.println ("เวลาอัพเกรดคือ:" + วันที่ใหม่ (). tolocalestring ()); - /** ลูกค้าไม่สามารถมองเห็นได้จากพร็อกซีออบเจ็กต์*/ เกมระดับสาธารณะ GamePlayerProxy3 {ตัวเกม igameplayer ส่วนตัว; // ผ่านวัตถุพร็อกซี (พร็อกซี) ผ่านตัวสร้างเกมสาธารณะ GampAlayerProxy3 (igameplayer gamplayer) {this.gameplayer = gamePlayer; System.out.println ("ฉันเป็นพร็อกซีตัวละครที่ฉันเล่นคือคนอื่นและสามารถส่งผ่านได้"); } สาธารณะ igameplayer getProxy () {return (igameplayer) proxy.newproxyinstance (this.getClass (). getClassLoader (), คลาสใหม่ [] {igameplayer.class}, myinvocationhandler (ใหม่); } คลาสส่วนตัว MyInVocationHandler ใช้ InvocationHandler {@Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีเมธอดวัตถุ [] args) โยนได้ {ถ้า (method.getName (). เท่ากับ ("ล็อกอิน")) {system.out.println ("ท้องถิ่น (") "); } if (method.getName (). เท่ากับ ("อัปเกรด")) {system.out.println ("เวลาอัปเกรดคือ:" + วันที่ใหม่ (). tolocalestring ()); } method.invoke (gamePlayer, args); คืนค่า null; - การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) { /** พร็อกซีคงที่ปกติ: ไคลเอนต์ไม่ทราบวัตถุพร็อกซีและวัตถุพร็อกซีเสร็จสิ้นการเรียกใช้ฟังก์ชัน* / igameplayer proxy = ใหม่ gamePlayerProxy ("x"); System.out.println ("เวลาเริ่มต้นคือ:" + วันที่ใหม่ (). tolocalestring ()); Proxy.login ("Zhangsan", "ABCD"); Proxy.Killboss (); proxy.upgrade (); System.out.println ("เวลาสิ้นสุดคือ:" + วันที่ใหม่ (). tolocalestring ()); System.out.println (); /** วัตถุพร็อกซีช่วยเพิ่มฟังก์ชั่นของวัตถุพร็อกซี*/ igameplayer proxy2 = ใหม่ gamePlayerProxy2 ("M"); proxy2.login ("lisi", "efg"); Proxy2.Killboss (); Proxy2.upgrade (); System.out.println (); /** พร็อกซีแบบไดนามิก: ใช้ InvocationHandler ที่จัดทำโดย JDK เพื่อสะท้อนวิธีการเรียกวัตถุพร็อกซี* รวมกับ java.reflect.proxy เพื่อสร้างวัตถุพร็อกซี* เข้าสู่วัตถุพร็อกซีแบบไดนามิก (การแจ้งเตือน) * ใน GamePlayerProxy3 มันเป็นเวลาเริ่มต้นการแจ้งเตือนเมื่อวิธีการที่เรียกว่าเข้าสู่ระบบและเวลาสิ้นสุดการแจ้งเตือนเมื่อการอัพเกรด */ gamePlayerProxy3 dynamic = ใหม่ GamePlayerProxy3 (GamePlayer ใหม่ ("Y")); igameplayer DynamicPlayer = dynamic.getProxy (); DynamicPlayer.login ("Wangwu", "1234"); DynamicPlayer.killboss (); DynamicPlayer.Upgrade (); /** edit-oriented: ตรรกะทางธุรกิจที่คล้ายกันบางอย่างจำเป็นต้องเพิ่มในหลาย ๆ สถานที่ดังนั้นเราจึงสามารถแยกออกเป็นส่วนซึ่งเป็นส่วนการทำธุรกรรม: เช่นส่วนบันทึกส่วนการอนุญาตส่วนธุรกิจ*/}}} พิมพ์:
เวลาเริ่มต้นคือ: 2014-10-8 17:19:05 บทบาทการเข้าสู่ระบบ X กับจางซานนั้นเข้าสู่ระบบได้สำเร็จ! X กำลังต่อสู้กับสัตว์ประหลาด! X ได้รับการอัพเกรดเป็นอีกระดับ! เวลาสิ้นสุดคือ: 2014-10-8 17:19:05 เวลาเข้าสู่ระบบคือ: 2014-10-8 17:19:05 บทบาทการเข้าสู่ระบบ M พร้อมชื่อ Lisi เข้าสู่ระบบได้สำเร็จ! M กำลังต่อสู้กับสัตว์ประหลาด! M ได้รับการอัพเกรดเป็นอีกระดับ! เวลาอัพเกรดคือ: 2014-10-8 17:19:05 ฉันเป็นผู้เล่นพร็อกซี ตัวละครที่ฉันเล่นเป็นของคนอื่นและฉันสามารถส่งผ่านมันไปสู่การเข้าสู่ระบบได้เวลาคือ: 2014-10-8 17:19:05 ตัวละครเข้าสู่ระบบ y ด้วยชื่อ Wangwu ได้เข้าสู่ระบบได้สำเร็จ! Y กำลังต่อสู้กับสัตว์ประหลาด! เวลาอัปเกรดคือ: 2014-10-8 17:19:05 Y ได้รับการอัพเกรดเป็นอีกระดับ!
ข้อได้เปรียบ
(1) บทบาทของความรับผิดชอบที่ชัดเจนคือการตระหนักถึงตรรกะทางธุรกิจที่แท้จริงและคุณไม่จำเป็นต้องใส่ใจเกี่ยวกับกิจการที่ไม่รับผิดชอบอื่น ๆ คุณสามารถทำธุรกรรมผ่านเอเจนต์ในภายหลังได้ ผลประกอบการนั้นกระชับและเขียนโปรแกรมที่ชัดเจน
(2) วัตถุพร็อกซีสามารถทำหน้าที่เป็นตัวกลางระหว่างลูกค้าและวัตถุเป้าหมายซึ่งมีบทบาทและปกป้องวัตถุเป้าหมาย
(3) ความยืดหยุ่นสูง