الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرمافزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفهجویی در زمان و تولید کد های با کیفیت، توسعهپذیر و انعطافپذیر استفاده میکنیم. در این مطلب قصد داریم الگوی طراحی Proxy را معرفی کنیم.
الگوی Proxy یک الگوی ساختاری(structural) است که یک جانشین یا placeholder برای یک شی دیگر فراهم میکند که از طریق آن میشود آن شئ را کنترل کرد. این الگو مکانیزمی را پیاده میکند که به عنوان یک واسطه بین کلاینت و یک شی هدف عمل می کند و به کلاینت اجازه می دهد تا با شی هدف به طور غیر مستقیم از طریق شی Proxy ارتباط برقرار کند. هدف اصلی این الگو ارائه دسترسی برای کنترل یک شئ بدون بکارگیری مستقیم آن است.
الگوی پروکسی از سه جزء تشکیل شده است:
1. Proxy: این شئ جانشین شئ اصلی است که به عنوان جایگزینی برای شئ مورد نظر عمل می کند. این شئ ویژگی های مشابه شئ اصلی را دارد که با بکارگیری آن ها، دستورات به شئ اصلی منتقل میشود.
2. Target: این شئ، همان شئ اصلی است که پروکسی آن را تغییر می دهد.
3. Client: این شئی است که با پروکسی، برای دسترسی به شی مورد نظر تعامل دارد.
در ادامه نمونه ای از الگوی پروکسی در سی شارپ آمده است:
public interface IImage
{
void Display();
}
public class RealImage : IImage
{
private string _filename;
public RealImage(string filename)
{
_filename = filename;
LoadFromDisk();
}
public void Display()
{
Console.WriteLine($"Displaying {_filename}");
}
private void LoadFromDisk()
{
Console.WriteLine($"Loading {_filename} from disk");
}
}
public class ProxyImage : IImage
{
private RealImage _realImage;
private string _filename;
public ProxyImage(string filename)
{
_filename = filename;
}
public void Display()
{
if (_realImage == null)
{
_realImage = new RealImage(_filename);
}
_realImage.Display();
}
}
public class Client
{
private IImage _image;
public Client(IImage image)
{
_image = image;
}
public void DisplayImage()
{
_image.Display();
}
}
// Usage
var proxyImage = new ProxyImage("test.jpg");
var client = new Client(proxyImage);
client.DisplayImage();
در این مثال، IImage رابطی است که پروکسی و تصویر واقعی پیاده سازی می کنند. RealImage شی هدفی است که یک تصویر را از دیسک بارگذاری کرده و آن را نمایش می دهد. ProxyImage شیء پراکسی است که به تصویر واقعی متصل میشود. هنگامی که متد Display بر روی شی پراکسی فراخوانی می شود، بررسی می کند که آیا تصویر واقعی هنوز ایجاد شده است یا خیر. اگر نه، تصویر واقعی را ایجاد می کند و سپس متد Display را روی آن فراخوانی می کند.
درنهایت از طریق Client میتوانیم فرآیند های موردنظر را اجرا کنیم.
برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همهی الگو های طراحی میشود، برای شما قرار گرفته است.
من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که مینویسم بدردتون بخوره.
ثبت دیدگاه