ตัวแทนทุกคนรู้ว่าเมื่อคุณไปช็อปปิ้งมีตัวแทนมากมายและพวกเขาเพิ่งขายผลิตภัณฑ์ดั้งเดิม ตัวอย่างเช่นหากคุณต้องการซื้อเนื้อสัตว์ทุกวันหมูจะถูกเลี้ยงโดยเกษตรกร แต่ถ้าคุณซื้อเนื้อสัตว์จากคนขายเนื้อคนขายเนื้ออาจถือได้ว่าเป็นตัวแทน ทำไมคุณถึงต้องการตัวแทน? หมูแล้วฆ่าพวกเขา
วิธีการใช้กระบวนการนี้ด้วยรหัส: เราควรใช้สามหมวดหมู่: คนขายเนื้อและเกษตรกรเพื่ออ้างถึงคุณคนขายเนื้อและเกษตรกรตามลำดับ ในหมู่พวกเขาชาวนายังให้วิธีการซื้อเนื้อสัตว์เพื่อเรียกคนขายเนื้อ
การคัดลอกรหัสมีดังนี้:
ชาวนาในชั้นเรียน {
Public Int Buymeat (Int Money) {
int meat = 0;
// ... เนื้อ = ***;
เนื้อกลับ;
-
-
คนขายเนื้อให้วิธีการซื้อเนื้อสัตว์ รหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
คนขายเนื้อคลาส {
Public Int Buymeat (Int Money) {
เกษตรกรชาวนา = ชาวนาใหม่ (); // 1. ค้นหาชาวนา
Int Meat = Farmer.Buymeat (เงิน); // 2. ซื้อเนื้อสัตว์จากชาวนา
เนื้อสัตว์ += 5;
กลับเนื้อสัตว์;
-
-
อย่างไรก็ตามรหัสที่คุณซื้อเนื้อสัตว์จากคนขายเนื้อจะเป็นเช่นนี้:
การคัดลอกรหัสมีดังนี้:
ชั้นเรียนคุณ {
งานโมฆะสาธารณะ () {
int youmoney = 10;
Butcher Butcher = New Butcher (); // ค้นหาคนขายเนื้อ
int meat = butcher.buymeat (youmoney);
System.out.println ("ปรุงเนื้อสัตว์น้ำหนัก:" + เนื้อสัตว์); // คุณปรุงมัน
-
-
เราสามารถเพิ่มประสิทธิภาพโปรแกรมนี้ได้ มันเป็นคนขายเนื้อหรือเกษตรกร
การคัดลอกรหัสมีดังนี้:
ชั้นเรียนคุณ {
งานโมฆะสาธารณะ () {
int youmoney = 10;
Peldar Peldar = New Butcher ();
int meat = peldar.buymeat (youmoney);
System.out.println ("ปรุงอาหาร, น้ำหนัก:" + เนื้อ);
-
-
อินเทอร์เฟซ Peldar {
int buymeat (เงิน int);
-
Class Butcher ใช้ Peldar {
@Override
Public Int Buymeat (Int Money) {
เกษตรกรชาวนา = ชาวนาใหม่ (); // 1. ค้นหาชาวนา
Int Meat = Farmer.Buymeat (เงิน); // 2. ซื้อเนื้อสัตว์จากชาวนา
เนื้อสัตว์ += 5;
กลับเนื้อสัตว์;
-
-
ชาวนาในชั้นเรียนใช้ Peldar {
@Override
Public Int Buymeat (Int Money) {
int meat = 0;
// ... เนื้อ = ***;
เนื้อกลับ;
-
-
นี่คือพร็อกซี
อย่างไรก็ตามสิ่งนี้เรียกว่าพร็อกซีแบบคงที่เพราะคลาสพร็อกซี (คลาส Butcher) เขียนโดยคุณและพร็อกซีแบบไดนามิกคือการสร้างคลาสพร็อกซีที่เทียบเท่ากันแบบไดนามิกเมื่อ Java กำลังทำงานอยู่ แม้ว่าชั้นเรียนจะถูกสร้างขึ้นแบบไดนามิกรหัสสำหรับการฆ่าหมูและการฉีดน้ำยังคงต้องเขียนอยู่เพียงแค่ไม่เขียนชั้นเรียนอีกต่อไป จะเขียนได้ที่ไหน?
การคัดลอกรหัสมีดังนี้:
อินเทอร์เฟซ Public InvocationHandler {
วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีวิธีการวัตถุ [] args) โยนได้
-
พารามิเตอร์หมายถึงอะไร?
การคัดลอกรหัสมีดังนี้:
อินเทอร์เฟซ Public InvocationHandler {
วัตถุสาธารณะเรียกใช้ (Butcher Object, Buymeat, Object [] เงิน) โยนได้
-
พารามิเตอร์แรกเป็นวัตถุของคลาสพร็อกซีที่สร้างขึ้นโดยอัตโนมัติ (วัตถุของคลาส butcher ที่สร้างขึ้นโดยอัตโนมัติ) และพารามิเตอร์ที่สองเป็นวัตถุของวิธีการที่ถูกเรียก (วิธีการมีวัตถุอย่างไรดู Java กลไกการสะท้อนกลับ) ดังนั้นรหัสสำหรับการฆ่าหมูและการเติมน้ำจึงกลายเป็นเช่นนี้เมื่อเขียน:
การคัดลอกรหัสมีดังนี้:
InvocationHandler minVocationHandler = new InvocationHandler () {
@Override
วัตถุสาธารณะเรียกใช้ (Butcher Object, Method Buymeat, Object [] args) โยน {throwable {
เกษตรกรชาวนา = ชาวนาใหม่ (); // 1. ค้นหาชาวนา
int meat = (จำนวนเต็ม) buymeat.invoke (เกษตรกร, args);
เนื้อสัตว์ += 5;
กลับเนื้อสัตว์;
-
-
นี่เป็นวิธีที่ไม่สอดคล้องกับวิธีการซื้อเนื้อสัตว์ของเกษตรกร คุณอาจถามว่าทำไมไม่เรียกมันโดยตรง? คุณมีวัตถุเกษตรกรจำนวนมากแม้จะไม่ใช่วัตถุเกษตรกรสามารถใช้เป็นอินสแตนซ์ของอินเทอร์เฟซบางอย่าง (ซึ่งระบุอินเทอร์เฟซด้านล่างให้ตั้งชื่อมันเป็นอันดับแรก) และสามารถส่งผ่านเป็นพารามิเตอร์แล้ววิธีการเรียกมัน ตอนนี้มาดูวิธีการสร้างคลาสพร็อกซี
การคัดลอกรหัสมีดังนี้:
วัตถุสแตติกสาธารณะ newproxyinstance (classloader loader, คลาส <?> [] อินเตอร์เฟส, InvocationHandler H)
โยน islegalargumentException
อธิบายพารามิเตอร์ เป็นอินเทอร์เฟซและมันถูกสร้างขึ้นใหม่ ในอาร์เรย์และการโทรที่กล่าวถึงในย่อหน้าก่อนหน้าคือปัญหาของความล้มเหลวก็ชัดเจนเช่นกัน พารามิเตอร์ที่สามคือ InvocationHandler นั้นเป็นที่เข้าใจกันดีกว่านั่นคือตราบใดที่วิธีการใด ๆ ในคลาสพร็อกซีเรียกว่า InvocationHandler จะได้รับแจ้ง รหัสที่สมบูรณ์เขียนไว้ด้านล่าง:
การคัดลอกรหัสมีดังนี้:
ชั้นเรียนคุณ {
งานโมฆะสาธารณะ () {
int youmoney = 10;
peldar peldarproxy = (peldar) proxy.newproxyinstance (getclass (). getclassloader (), คลาสใหม่ [] {peldar.class}, minvocationhandler);
int meat = peldarproxy.buymeat (youmoney);
System.out.println ("ปรุงเนื้อสัตว์น้ำหนัก:" + เนื้อสัตว์);
-
InvocationHandler minVocationHandler = new InvocationHandler () {
@Override
วัตถุสาธารณะเรียกใช้ (Butcher Object, Method Buymeat, Object [] args)
โยนได้ {
เกษตรกรชาวนา = ชาวนาใหม่ (); // 1. ค้นหาชาวนา
int meat = (จำนวนเต็ม) buymeat.invoke (เกษตรกร, args);
เนื้อสัตว์ += 5;
กลับเนื้อสัตว์;
-
-
-
อินเทอร์เฟซ Peldar {
int buymeat (เงิน int);
-
ชาวนาในชั้นเรียนใช้ Peldar {
@Override
Public Int Buymeat (Int Money) {
int meat = 0;
// ... เนื้อ = ***;
เนื้อกลับ;
-
-
ที่นี่คลาสพร็อกซีถูกสร้างขึ้นในชั้นเรียนของคุณ