سلام دوستان. می‌خوایم با الگویی آشنا بشیم که بهمون کمک می‌کنه تا اتفاق‌هایی که برای یک آبجکت رخ میده رو بتونیم کنترل کنیم. این الگو پراکسی (Proxy) هست و معمولاً برای مدیریت کردن دسترسی و یا اضافه کردن ویژگی‌هایی به یک آبجکت استفاده میشه.

موارد زیر رو توی این پست بررسی می‌کنیم:

 

مشکل کجاست؟ 🤔

فرض کنیم آبجکتی داریم که عملیات سنگینی انجام میده و باعث مصرف مقدار زیادی از منابع میشه. برای مثال برای دانلود فایل کلاسی در اختیار داریم به صورت زیر:

class FileDownloader {
  public download(url) {
    http.get(url, function (file) {
      file.save("/home");
    });
  }
}

و به این صورت ازش استفاده می‌کنیم:

const downloader = new FileDownloader();
downloader.download('http://path-to-file.jpg');
downloader.download('http://path-to-file.jpg');
downloader.download('http://path-to-file.jpg');
downloader.download('http://path-to-file.jpg');

همونطور که می‌بینیم توی چهار خط آخر داریم یک فایل رو ۴ بار دانلود می‌کنیم که در نتیجه اگه با یک فایل حجیم سر و کار داشته باشیم باعث هدر رفتن و درگیر شدن بیش‌از حد منابع میشه. ما با الگوی Proxy می‌تونیم کاری کنیم که این فایل فقط یک بار دانلود و ذخیره بشه و توی درخواست‌های مشابه بعدی همون فایل برگردونده بشه.

 

الگوی پراکسی (Proxy) چیه؟

اگه معنی تحت‌الفظی پراکسی رو بدونیم درک این الگو برامون راحت‌تر میشه. پراکسی توی زبان پارسی یعنی نمایندهٔ رسمی شخص دیگری بودن برای انجام یک کار.

توی الگوی پراکسی، یک آبجکت، نمایندهٔ یک آبجکت دیگه برای انجام کارهای اون آبجکت میشه. پس می‌تونیم بگیم که:

یک پراکسی، آبجکتی هست که در نقش یک رابط یا واسط برای یک آبجکت دیگه عمل می‌کنه.

توی مثال بالا، کلاس FileDownloader سرویسی بود که می‌خواستیم از اون استفاده کنیم. اما این سرویس ناقص بود و یا کلاً ویژگی‌های مد نظر ما (جلوگیری از هدر رفت منابع) رو نداشت. برای حل مشکلمون، شاید به ذهنمون برسه که بیایم خود کلاس رو دستکاری کنیم. اما خیلی وقت‌ها این کار امکان‌پذیر نیست. مثلاً یک کلاس از یک پکیج خارجی هست و یا کلاً کدهای اون در دسترس نیست.