อ่าน 3 นาที
รูปแบบพร็อกซี
ใน การเขียนโปรแกรมคอมพิวเตอร์ รูป แบบพร็อกซี (Proxy pattern) เป็น รูปแบบการออกแบบซอฟต์แวร์ ที่เป็นคลาสที่ทำหน้าที่เป็นอินเทอร์เฟซไปยังสิ่งอื่น พร็อกซีสามารถเชื่อมต่อกับอะไรก็ได้...
รูปแบบพร็อกซี
ในการเขียนโปรแกรมคอมพิวเตอร์รูปแบบพร็อกซี (Proxy pattern)เป็นรูปแบบการออกแบบซอฟต์แวร์ที่เป็นคลาสที่ทำหน้าที่เป็นอินเทอร์เฟซไปยังสิ่งอื่น พร็อกซีสามารถเชื่อมต่อกับอะไรก็ได้ เช่น การเชื่อมต่อเครือข่าย วัตถุขนาดใหญ่ในหน่วยความจำ ไฟล์ หรือทรัพยากรอื่น ๆ ที่มีราคาแพงหรือไม่สามารถทำซ้ำได้ กล่าวโดยสรุป พร็อกซีคือวัตถุตัวห่อหุ้มหรือตัวแทนที่ถูกเรียกใช้โดยไคลเอนต์เพื่อเข้าถึงวัตถุที่ให้บริการจริงเบื้องหลัง การใช้งานพร็อกซีอาจเป็นการส่งต่อไปยังวัตถุจริง หรืออาจมีตรรกะเพิ่มเติม ในพร็อกซี สามารถเพิ่มฟังก์ชันการทำงานพิเศษได้ เช่น การแคชเมื่อการดำเนินการกับวัตถุจริงใช้ทรัพยากรมาก หรือการตรวจสอบเงื่อนไขก่อนที่จะเรียกใช้การดำเนินการกับวัตถุจริง สำหรับไคลเอนต์ การใช้งานวัตถุพร็อกซีจะคล้ายกับการใช้งานวัตถุจริง เพราะทั้งสองใช้การใช้งานอินเทอร์เฟซเดียวกัน
ภาพรวม
รูปแบบการออกแบบพร็อกซีเป็นหนึ่งใน 23 รูปแบบการออกแบบ GoF ที่รู้จักกันดี ซึ่งอธิบายวิธีการแก้ปัญหาการออกแบบที่เกิดขึ้นซ้ำๆ เพื่อออกแบบซอฟต์แวร์เชิงวัตถุ ที่มีความยืดหยุ่นและนำกลับมาใช้ใหม่ได้ นั่นคือวัตถุที่ง่ายต่อการใช้งาน เปลี่ยนแปลง ทดสอบ และนำกลับมาใช้ใหม่[ 1 ]
ปัญหา
รูปแบบการออกแบบพร็อกซีใช้เพื่อแก้ปัญหาดังกล่าว: [ 2 ]
- การเข้าถึงวัตถุควรได้รับการควบคุม
- ควรเพิ่มฟังก์ชันการทำงานเพิ่มเติมเมื่อเข้าถึงวัตถุ
ตัวอย่างเช่น เมื่อเข้าถึงข้อมูลที่มีความละเอียดอ่อน ควรสามารถตรวจสอบได้ว่าไคลเอ็นต์มีสิทธิ์ในการเข้าถึงที่จำเป็นหรือไม่
สารละลาย
กำหนดProxyวัตถุแยกต่างหากที่
- สามารถใช้แทนวัตถุอื่นได้ (
Subject) และ - เพิ่มฟังก์ชันเพิ่มเติมเพื่อควบคุมการเข้าถึงหัวข้อนี้
วิธีนี้ทำให้สามารถทำงานผ่านProxyวัตถุเพื่อดำเนินการฟังก์ชันเพิ่มเติมเมื่อเข้าถึงหัวข้อ เช่น การตรวจสอบสิทธิ์การเข้าถึงของไคลเอ็นต์ที่เข้าถึงวัตถุที่มีความละเอียดอ่อน
ในการทำหน้าที่แทนหัวข้อหลัก พร็อกซีจะต้องใช้งานSubjectอินเทอร์เฟซนั้น ลูกค้าไม่สามารถบอกได้ว่ากำลังทำงานกับหัวข้อหลักหรือพร็อกซี
โปรดดูแผนภาพคลาสและลำดับ UML ด้านล่างด้วย
โครงสร้าง
แผนภาพคลาสและลำดับ UML

ในแผนภาพคลาสUML ด้านบน คลาส นี้ ใช้อินเทอร์เฟซเพื่อให้สามารถทำหน้าที่แทนวัตถุได้ โดยจะเก็บการอ้างอิง ( ) ไปยังวัตถุที่ถูกแทนที่ ( ) เพื่อให้สามารถส่งต่อคำขอไปยังวัตถุนั้นได้ ( ) ProxySubjectSubjectrealSubjectRealSubjectrealSubject.operation()
แผนภาพลำดับแสดงปฏิสัมพันธ์ขณะทำงาน: Clientวัตถุทำงานผ่านProxyวัตถุที่ควบคุมการเข้าถึงRealSubjectวัตถุ ในตัวอย่างนี้ วัตถุProxyจะส่งต่อคำขอไปยังวัตถุRealSubjectที่ดำเนินการตามคำขอ
แผนภาพคลาส


ตัวอย่างการใช้งานที่เป็นไปได้
พร็อกซีระยะไกล
ในการสื่อสารระหว่างวัตถุแบบกระจาย วัตถุภายในเครื่องจะแทนวัตถุภายนอกเครื่อง (ซึ่งอยู่ในพื้นที่แอดเดรสที่แตกต่างกัน) วัตถุภายในเครื่องทำหน้าที่เป็นพร็อกซีของวัตถุภายนอกเครื่อง และการเรียกใช้เมธอดบนวัตถุภายในเครื่องจะส่งผลให้เกิดการเรียกใช้เมธอดบนวัตถุภายนอกเครื่องนั้นด้วย ตัวอย่างเช่น การใช้งาน ตู้เอทีเอ็มซึ่งตู้เอทีเอ็มอาจเก็บวัตถุพร็อกซีสำหรับข้อมูลธนาคารที่อยู่ในเซิร์ฟเวอร์ระยะไกล
พร็อกซีเสมือน
ในบางกรณี การใช้โครงร่างแทนวัตถุที่ซับซ้อนหรือมีขนาดใหญ่ อาจเป็นประโยชน์มากกว่า เมื่อภาพต้นฉบับมีขนาดใหญ่มาก อาจใช้ภาพเสมือนเป็นตัวแทน และโหลดวัตถุจริงเมื่อต้องการใช้งาน
พร็อกซีป้องกัน
อาจใช้พร็อกซีป้องกันเพื่อควบคุมการเข้าถึงทรัพยากรโดยอิงตามสิทธิ์การเข้าถึง
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างของรูปแบบการออกแบบพร็อกซีในภาษา C++ :
import std ;using std :: string ; using std :: unique_ptr ;// คลาสอินเทอร์เฟซของหัวเรื่องImage { public : virtual void display () const = 0 ; virtual ~ Image () = default ; };// วัตถุจริง (ใช้เวลาในการโหลดมาก) คลาสRealImage : public Image { private : string filename ; public : explicit RealImage ( const string & file ) : filename { file } { loadFromDisk (); } }void display () const override { std :: println ( "กำลังแสดงภาพ: {}" , filename ); }private : void loadFromDisk () const { std :: println ( "กำลังโหลดภาพจากดิสก์: {}" , filename ); } };// พร็อกซี (ควบคุมการเข้าถึง RealImage) คลาสProxyImage : public Image { private : string filename ; mutable unique_ptr < RealImage > realImage ; // สร้างขึ้นแบบไม่ทันทีpublic : explicit ProxyImage ( const string & file ) : filename { file } {}void display () const override { if ( ! realImage ) { std :: println ( " (Proxy) กำลังโหลดรูปภาพตามต้องการ..." ); realImage = std :: make_unique <RealImage> ( filename ); } realImage- > display ( ); } };// โค้ดฝั่งไคลเอ็นต์int main () { Image * img = new ProxyImage ( "photo.png" );// แสดงผลครั้งแรก (ควรโหลดเสร็จ) img -> display ();// การแสดงผลครั้งที่สอง (ควรใช้ภาพที่แคชไว้) img -> display ();ลบรูปภาพ; ส่งคืนค่า0 ; }ดูเพิ่มเติม
ลิงก์ภายนอก
- Geary, David (22 กุมภาพันธ์ 2545). "ควบคุมด้วยรูปแบบการออกแบบ Proxy" . JavaWorld . สืบค้นเมื่อ20 กรกฎาคม 2563 .
- โปรเจกต์โอเพนซอร์ส PerfectJPatternนำเสนอการใช้งาน Proxy Pattern ในรูปแบบคอมโพเนนต์ในภาษา Java
- การเปรียบเทียบรูปแบบ Adapter, Proxy และ Facadeที่Wayback Machine (เก็บถาวรเมื่อ 11 มีนาคม 2012)
- รูปแบบการออกแบบพร็อกซี
- ตัวอย่างการใช้งานรูปแบบพร็อกซีในภาษา C++ที่Wayback Machine (เก็บถาวรเมื่อ 19 ตุลาคม 2014)
- คำอธิบายรูปแบบพร็อกซีจากคลังรูปแบบพอร์ตแลนด์
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ รูปแบบพร็อกซี
ใน การเขียนโปรแกรมคอมพิวเตอร์ รูป แบบพร็อกซี (Proxy pattern) เป็น รูปแบบการออกแบบซอฟต์แวร์ ที่เป็นคลาสที่ทำหน้าที่เป็นอินเทอร์เฟซไปยังสิ่งอื่น พร็อกซีสามารถเชื่อมต่อกับอะไรก็ได้...
ภาพรวม
รูปแบบการออกแบบพร็อกซีเป็นหนึ่งใน 23 รูปแบบการออกแบบ GoF ที่รู้จักกันดี ซึ่งอธิบายวิธีการแก้ปัญหาการออกแบบที่เกิดขึ้นซ้ำๆ เพื่อออกแบบ ซอฟต์แวร์เชิงวัตถุ ที่มีความยืดหยุ่นและนำกลับมาใช้ใหม่ได้ นั่นคือวัตถุที่ง่ายต่อการใช้งาน เปลี่ยนแปลง ทดสอบ...
ปัญหา
รูปแบบการออกแบบพร็อกซีใช้เพื่อแก้ปัญหาดังกล่าว: [ 2 ]
แผนภาพคลาสและลำดับ UML
ใน แผนภาพคลาส UML ด้านบน คลาส นี้ ใช้อินเทอร์เฟซเพื่อให้สามารถทำหน้าที่แทนวัตถุได้ โดยจะเก็บการอ้างอิง ( ) ไปยังวัตถุที่ถูกแทนที่ ( ) เพื่อให้สามารถส่งต่อคำขอไปยังวัตถุนั้นได้ ( ) Proxy Subject Subject realSubject RealSubject realSubject.operation()