الـ Proxy Pattern معناه ببساطة:
إنك تعمل "وكيل" للوصول لموارد غالية.
زي التأشيرة (visa):
- بدل ما تدخل البلد مباشرة (غالي)
- تأخذ تأشيرة (وكيل) أولاً
- التأشيرة بتسيطر على الوصول
بدون Proxy، تحمّل كل شيء:
class HeavyImage {
constructor(filename: string) {
this.loadImage(filename); // بطيء!
}
}مع Proxy (lazy loading):
class ImageProxy {
private realImage: HeavyImage | null = null;
display(): void {
if (!this.realImage) {
this.realImage = new HeavyImage(); // حمّل وقت الحاجة
}
this.realImage.display();
}
}Subject interface:
interface Image {
display(): void;
}Real subject:
class HeavyImage implements Image {
constructor() {
console.log("Loading heavy image...");
// بطيء جدا
}
display(): void {
console.log("Displaying image");
}
}Proxy:
class ImageProxy implements Image {
private realImage: HeavyImage | null = null;
display(): void {
if (!this.realImage) {
this.realImage = new HeavyImage();
}
this.realImage.display();
}
}الاستخدام:
const image = new ImageProxy();
// ما حمّش الصورة بعد
image.display(); // الآن يحمّلها ويعرضها
image.display(); // مرة تانية بدون تحميل (موجود في memory)- Virtual Proxy: lazy loading (الحالة السابقة)
- Protection Proxy: control access
- Remote Proxy: access remote objects
- Logging Proxy: log operations
موارد غالية (صور كبيرة، اتصالات database، API calls):
- بدون Proxy: تحمّلها كل مرة
- مع Proxy: احمّلها لما تحتاج فقط
- Lazy Loading: احمّل لما تحتاج
- Access Control: كنترول من بيدخل
- Logging & Monitoring: سجل الأنشطة
- Performance: تجنب operations غالية
- Adapter: يحول interface
- Proxy: يتحكم بالوصول (نفس interface)
استخدم Proxy لما عندك resources غالية وتريد:
- Lazy loading
- Access control
- Logging
classDiagram
class Subject {
<<interface>>
+display() void
}
class HeavyImage {
+display() void
}
class ImageProxy {
-realImage: HeavyImage
+display() void
}
Subject <|.. HeavyImage
Subject <|.. ImageProxy
ImageProxy --> HeavyImage