1. پراکسی پیٹرن کیا ہے
پراکسی پیٹرن ایک ساختی ڈیزائن پیٹرن ہے جو ایک پراکسی کے طور پر کسی خاص شے تک رسائی کو نگرانی کرنے کے لیے کام کرتا ہے۔ ٹارگٹ شے (جس شے کی پراکسی کی جا رہی ہے) کے مطابق، پراکسی پیٹرن پراکسی شے فراہم کرتا ہے جس کے ذریعے کلائنٹس ٹارگٹ شے تک رسائی حاصل کر سکتے ہیں، جو ٹارگٹ شے میں اضافی فعالیت کو شامل کرنے کی اجازت دیتا ہے۔
1.1 پراکسی پیٹرن کی تعریف
پراکسی پیٹرن ایک ڈیزائن پیٹرن ہے جو دو یا مزید دو شےوں کے تعاون پر مشتمل ہوتا ہے۔ ایک شے واقعی ٹارگٹ شے ہوتا ہے جس کو بلایا جا رہا ہے، جبکہ ایک یا مزید دوسرے شے پراکسی شےوں کے طور پر کام کرتے ہیں۔ پراکسی شےوں نے ٹارگٹ شے تک رسائی کو روک لیا، ٹارگٹ شے تک رسائی حاصل کرنے کا ایک غیر مستقیم طریقہ فراہم کرتے ہیں۔
1.2 پراکسی پیٹرن کا مقصد اور ارادے
پراکسی پیٹرن کا اصل مقصد ٹارگٹ شے تک رسائی کا ایک غیر مستقیم طریقہ فراہم کرنا ہے، جو ٹارگٹ شے میں اضافی فعالیت کو شامل کرنے کی اجازت دیتا ہے۔ پراکسی شےوں عام منطق کو منظم کرسکتے ہیں، مثلاً ٹارگٹ شے تک رسائی کو نگرانی کرنا، کیشنگ، اور لاگنگ۔ پراکسی پیٹرن دیر لوڈنگ بھی لاگو کرسکتا ہے، صرف اس وقت ٹارگٹ شے کو تخلیق کیا جاتا ہے جب ضرورت ہو۔
2. پراکسی پیٹرن کی خصوصیات اور فوائد
پراکسی پیٹرن کی منفرد خصوصیات اور فوائد درج ذیل ہیں:
- یہ ٹارگٹ شے کی فعالیت کو ترتیب دیئے بغیر اس کی فعالیت کو بڑھا سکتا ہے۔
- یہ پراکسی شے کے ذریعے ٹارگٹ شے تک رسائی کو نگرانی کرسکتا ہے۔
- یہ ٹارگٹ شے تک رسائی سے پہلے یا بعد میں اضافی فعالیتیں انجام دے سکتا ہے۔
- یہ دیر لوڈنگ کو لاگو کرسکتا ہے، صرف اس وقت ٹارگٹ شے کو تخلیق کیا جاتا ہے جب ضرورت ہو۔
3. عملی استعمال کی مثالیں پراکسی پیٹرن کی
پراکسی پیٹرن کو بہت سارے اطلاقاتی مناظر میں استعمال کیا جاتا ہے۔ یہاں کچھ عام عملی استعمال کی مثالیں ہیں:
- دور رس پراکسی: مقامی طور پر نیٹ ورک پر شے تک رسائی حاصل کرنے کے لیے استعمال ہوتا ہے۔
- جعلی پراکسی: ضرورت کے مطابق مہنگے شے تخلیق کرنے کے لیے استعمال ہوتا ہے۔
- سیکیورٹی پراکسی: شے تک رسائی کو نگرانی کرنے کے لیے استعمال ہوتا ہے۔
- ذکی حوالہ: شے تک رسائی کے دوران اضافی فعالیتیں انجام دینے کے لیے استعمال ہوتا ہے، جیسے کے شے شماری۔
4.1 UML کلاس شکل
نیچے دی گئی ہے گولینگ میں پراکسی پیٹرن کی UML کلاس شکل:
4.2 مثال کی تعارف
سوچیں کہ ہمارے پاس ایک انٹرفیس Subject
ہے جو Request
میں تعریف کرتا ہے۔ ہمارے پاس ایک مضموناتی نمائندہ کلاس RealSubject
ہے، جو Subject
انٹرفیس کی تعریف میں ایمپلیمنٹ کرتا ہے۔ پھر ہم ایک پراکسی کلاس Proxy
بناتے ہیں، جو ایک RealSubject
شے کو رکھتا ہے اور ساتھ ہی Subject
انٹرفیس کو بھی مقرر کرتا ہے۔ Proxy
کلاس کے Request
میں میتھڈ میں، ہم ٹارگٹ کی Request
میتھڈ کو بلانے سے پہلے یا بعد میں کچھ اضافی عمل کر سکتے ہیں۔
4.3 انجماد پہلو 1: پراکسی انٹرفیس کی تعریف
پہلے، ہمیں ایک Subject
انٹرفیس کی تعریف کرنی ہوگی جو ایک Request
میتھڈ شامل کرتا ہے:
package main
type Subject interface {
Request()
}
4.4 انجماد پہلو 2: ٹارگٹ شے کا عمل
اس کے بعد، ہم واضح ٹارگٹ شے RealSubject
کو ایمپلیمنٹ کرتے ہیں، جو Subject
انٹرفیس کو بناتا ہے:
package main
import "fmt"
type RealSubject struct {}
func (r *RealSubject) Request() {
fmt.Println("RealSubject: Handling Request")
}
4.5 انجماد پہلو 3: پراکسی شے کے عمل
اس کے بعد، ہم ایک پراکسی شے، Proxy، کو بناتے ہیں جو ایک RealSubject شے کو رکھتا ہے اور Subject انٹرفیس کو بھی ایمپلیمنٹ کرتا ہے۔ پراکسی کے Request میتھڈ میں، ہم واضح ٹارگٹ کی ریکویسٹ میتھڈ کو بلانے سے پہلے یا بعد میں کچھ اضافی عمل کر سکتے ہیں:
package main
import "fmt"
type Proxy struct {
realSubject *RealSubject
}
func (p *Proxy) Request() {
fmt.Println("Proxy: Pre-Request")
if p.realSubject == nil {
p.realSubject = &RealSubject{}
}
p.realSubject.Request()
fmt.Println("Proxy: Post-Request")
}
4.6 انجماد پہلو 4: پراکسی شے کو بلا کرنا
آخر میں، ہم پراکسی شے، Proxy، کو استعمال کر کے مقررات کی میتھڈ کو بلاسکتے ہیں:
package main
func main() {
proxy := Proxy{}
proxy.Request()
}
اوپر دیے گئے کوڈ کو چلانے سے نتیجہ یہ ہوگا:
Proxy: Pre-Request
RealSubject: Handling Request
Proxy: Post-Request
5.1 پراکسی پیٹرن اور ڈیکوریٹر پیٹرن کے درمیان فرق اور تعلق
پراکسی پیٹرن اور ڈیکوریٹر پیٹرن دونوں ساختمانی ڈیزائن پیٹرنز ہیں، جن میں کارگر اشیاء اور پراکسی/ڈیکوریٹر اشیاء شامل ہیں۔ تاہم، دونوں کے درمیان کچھ فرق ہیں:
- پراکسی پیٹرن عموماً کارگر اشیاء تک رسائی کنٹرول شامل کرتا ہے، جبکہ ڈیکوریٹر پیٹرن زیادہ تر کارگر اشیاء کو بڑھانے پر توجہ دیتا ہے۔
- پراکسی پیٹرن عام طور پر کارگر اشیاء سے پہلے یا بعد میں اضافی عملیات انجام دیتا ہے، جبکہ ڈیکوریٹر پیٹرن کارگر اشیاء پر متغیر فعالیتیں دینے کا عمل دینے کا اہمیت دیتا ہے۔
5.2 استاتیک پروکسی اور ڈائنامک پروکسی کے موازنہ
پراکسی پیٹرن کو استاتیک پروکسی اور ڈائنامک پروکسی میں تقسیم کیا جا سکتا ہے۔ استاتیک پروکسی وقت کے پیش نظر پروکسی اشیاء کی قسم تعین کرتا ہے، اور پروگرامر کی زمین پر ہاتھ سے لکھی گئی پروکسی اشیاء ہوتی ہیں۔ دوسری طرف، ڈائنامک پروکسی وقت کے اشیاء کی بنیاد پر مقصد اشیاء کے انٹرفیس کے تحت پروکسی اشیاء کو متحرک طریقے سے پیدا کرتا ہے۔ ڈائنامک پروکسی زیادہ مطابقت پسند ہیں لیکن اس کے استاتیک موازنہ میں زیادہ پیچیدہ ہوتا ہے۔
5.3 پراکسی پیٹرن کا مائیکروسروسز میں اطلاق
پراکسی پیٹرن کو مائیکروسروسز معماری میں استعمال کیا جا سکتا ہے۔ مثال کے طور پر، ہم دوسرے مائیکروسروسز تک رسائی کو مخفی کرنے اور پراکسی لیئے استعمال کر سکتے ہیں اور لوڈ بیلنسنگ، ریٹ لمٹنگ، اور سرکٹ کی ٹوڊوں کیسٹیقی کو پراکسی پتلے میں نافذ کرنا۔ یہ نظام کی قابلیت اور کارکردگی کو بہتر بنا سکتا ہے۔ پراکسی پیٹرن کو سروس ڈسکوروری اور راستہ تلاش کی فعالیتیوں کو نافذ کرنے کے لئے بھی استعمال کیا جا سکتا ہے۔