Proxy Tasarım Deseni - Proxy Design Pattern

15 December 2012

Ve geldik GOF tasarım desenlerinin sonuncusuna…

Proxy tasarım deseni çalışma maliyeti yüksek işlemlerin olduğu yapılarda, web servisi kullanılan yapılarda, remoting uygulamalarında, operasyonun gerçekleştirilmesinden önce hazırlık yapılması veya ön işlem yapılması durumlarında kullanılır. Uygulanışı basit bir tasarım desenidir. Uml diyagramı aşağıdadır.

proxy design pattern uml

Uml diyagramındaki Subject yapısı interface veya abstract sınıf olarak tasarlanır ve gerçekleştirilecek operasyonların tanımını belirtir. RealSubject ve Proxy ise gerçek sınıflardır. RealSubject sınıfı operasyonu gerçekleştirecek gerçek kodları barındırır. Proxy sınıfı ise RealSubject sınıfındaki operasyonları çalıştırır. Yani burada proxy nesnesi client ve operasyonu gerçekleştirecek metotların arasında bulunan bir yapı görevi görür.

Örnek uygulamamızın senaryosu resim gösterimi üzerine olsun. Gerçekte gösterilecek büyük boyutta resimlerin olduğunu ve kullanıcıya resmi gösterirken resimler yüklenene kadar ön izleme resmini gösteriyor olalım. Tabi ki kodlarımızın uzamaması için sadece konsol ekranına yazı yazdıracağız. Örnek uygulamanın sınıf diyagramı aşağıdadır.

proxy design pattern class diagram

Uygulamamızın açıklaması ve kodları aşağıdadır.


//Subject
interface IImageGenerator
{
    void ShowImage();
}

//RealSubject
class ImageGenerator : IImageGenerator
{
    public void ShowImage()
    {
        Console.WriteLine("gerçek resmi gösteriliyor.");
    }
}
//Proxy
class ImageGeneratorProxy : IImageGenerator
{
    //proxy sınıfı Subject i uygular ve içinde subject referansı barındırır.
    private ImageGenerator _generator;
    private Timer t;
    private bool LoadRealObject = false;
    private void ShowRealImage(object o)
    {
        _generator = new ImageGenerator();
        _generator.ShowImage();
        LoadRealObject = true;
    }
    public void ShowImage()
    {
        if (_generator == null)
        {
            //burada başka bir threadda asıl nesnenin yüklenmesinin başlatıldığını düşünebiliriz.
            t = new System.Threading.Timer(new TimerCallback(ShowRealImage), this, 2000, 0);
        }
        if (!LoadRealObject) //gerçek nesne yüklenmesi tamamlanmamış ise önizleme resmi gösterilsin.
            Console.WriteLine("önizleme resmi gösteriliyor.");
    }
}
class Program
{
    static void Main(string[] args)
    {
        ImageGeneratorProxy proxy1 = new ImageGeneratorProxy();
           
        proxy1.ShowImage();
        Console.ReadKey();
    }
}
 
Örnek uygulamayı aşağıdaki linkten indirebilirsiniz.

ProxySample.rar