Skip to content
Amir edited this page May 28, 2022 · 1 revision

الگو طراحی پروکسی

یک جانشین یا جایگاه برای کنترل دسترسی به یک شیء ایجاد می‌کند.

this is an image

کاربرد

  • کنترل دسترسی یا Protection Proxy
  • لاگ گیری در برنامه یاLogging Proxy
  • Caching proxy
  • اجرای لوکال یک سرویس از راه دور یا Remote Proxies
  • Lazy initialization یا Virtual Proxy
  • مرجع هوشمند

مزایا

  1. بدون اطلاع کلاینت ها، می‌توان شی اصلی و چرخه ی عمر آن را کنترل کرد.

  2. حتی اگر شی اصلی آماده ی به کار یا در دسترس نباشد، Proxy کار می‌کند.

  3. می‌توانید Proxy های جدید را بدون تغییر در شی اصلی یا کلاینت های آن تعریف کنید. (Open/Closed Principle)

  4. بر خلاف شی اصلی هزینه بر نیست و زمانی که واقعا به شی اصلی نیاز داشته باشیم آن را ایجاد می‌کند و در دسترس قرار می‌دهد (در حقیقت با به تاخیر انداختن ایجاد شی اصلی، از منابع سیستمی به خوبی استفاده می‌کند).

  5. از آنجا که proxy همان interface کلاس اصلی را پیاده سازی می‌کند، می‌توان آن را در هر کلاینت که انتظار یک شی اصلی را دارد، جایگزین کرد.

معایب

  1. باعث پیچیده‌تر شدن کد شود زیرا باید کلاس‌های جدید زیادی را معرفی کرد.

  2. پاسخ از سمت سرویس دهنده ممکن است به تاخیر بیافتد.

مثال یک

دسترسیِ کارمندای یه شرکت به اینترنت

public interface OfficeInternetAccess {  
    public void grantInternetAccess();  
}  
public class RealInternetAccess implements OfficeInternetAccess {  
    private String employeeName;  
    public RealInternetAccess(String empName) {  
        this.employeeName = empName;  
    }  
    @Override  
    public void grantInternetAccess() {  
        System.out.println("Internet Access granted for employee: "+ employeeName);  
    }  
} 
public class ProxyInternetAccess implements OfficeInternetAccess {  
    private String employeeName;  
    private RealInternetAccess  realaccess;  
    public ProxyInternetAccess(String employeeName) {  
        this.employeeName = employeeName;  
    }  
    @Override  
    public void grantInternetAccess()   {  
        if (getRole(employeeName) > 2)   {  
            realaccess = new RealInternetAccess(employeeName);  
            realaccess.grantInternetAccess();  
        } else {  
            System.out.println("No Internet access granted.");  
        }  
    }  
    public int getRole(String emplName) {  
            // Check role from the database based on Name and designation
           // return job level or job designation.
            return 3;  
    }  
}   
public class ProxyPatternClient {  
    public static void main(String[] args)   
    {  
        OfficeInternetAccess access = new ProxyInternetAccess("Ghodsian");  
        access.grantInternetAccess();  
    }  
} 

مثال دو

بارگیری عکس و کش کردن آن

public interface Image {
   void display();
}
public class RealImage implements Image {

   private String fileName;

   public RealImage(String fileName){
      this.fileName = fileName;
      loadFromDisk(fileName);
   }

   @Override
   public void display() {
      System.out.println("Displaying " + fileName);
   }

   private void loadFromDisk(String fileName){
      System.out.println("Loading " + fileName);
   }
}
public class ProxyImage implements Image{

   private RealImage realImage;
   private String fileName;

   public ProxyImage(String fileName){
      this.fileName = fileName;
   }

   @Override
   public void display() {
      if(realImage == null){
         realImage = new RealImage(fileName);
      }
      realImage.display();
   }
}
public class ProxyPatternDemo {
	
   public static void main(String[] args) {
      Image image = new ProxyImage("test_10mb.jpg");

      //image will be loaded from disk
      image.display(); 
      System.out.println("");
      
      //image will not be loaded from disk
      image.display(); 	
   }
}
Result
Loading test_10mb.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg

Is necessary

Design Pattern

Creational

Structural

Behavioral

Template

Clone this wiki locally