در این قسمت تیم کدگیت را با آموزش Proxy پترن در جاوا همراهی کنید. پیش نیاز این آموزش شامل موارد زیر میباشد:
- آشنایی با شی گرایی در جاوا
- آشنایی با interface در جاوا
- آشنایی با متد در جاوا
- Constructor در جاوا
- This در جاوا
- دیزاین پترن
Structural Patterns
یکی از زیر شاخههای دیزاین پترن Structural Patterns است. Structural Patterns در مورد اشیا و کلاسها و چگونگی ترکیب آنها با یکدیگر صحبت میکند. برای مشخص کردن ارتباط اشیا و کلاسها با یکدیگر، این پترن ساختار سادهای را ایجاد میکند (البته بیشتر تمرکز این پترن بر روی شی گرایی است).
Proxy پترن در جاوا
در Proxy پترن یک کلاس نمایندهای از کلاس دیگر را در خود دارد. Proxy پترن در کتاب Gang of Four بدین صورت تعریف شده است:” فراهم آوردن امکانی برای دسترسی به شی اصلی “. همچنین این پترن یکی از شاخههای Structural Patterns میباشد.

کد Proxy پترن در جاوا
فرض کنید یک Interface داریم به نام Image و دو کلاس RealImage و ProxyImage از آن استفاده میکنند. کلاس ProxyImage یک عکس را Load میکند این کار را با کمک کلاس RealImage انجام میدهد. کد این کلاسها به صورت زیر میباشد:
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();
}
}
تست Proxy پترن در جاوا
برای تست کدهای بالا، کد Main زیر را بزنید:
public static void main(String[] args) {
Image image = new ProxyImage("CodeGate.jpg");
//image will be loaded from disk
image.display();
System.out.println("");
//image will not be loaded from disk
image.display();
}
در کد بالا ما دو بار متد Display را صدا زدیم. بار اول کلاس ProxyImage به کمک کلاس RealImage عکس را Load کرده و بار بعد کلاس ProxyImage عکسی که قبل Load شده را دوباره بازخوانی میکند و دیگر کلاس RealImage را فراخوانی نمیکند.