C# Proxy Pattern Kullanımı - OOP Design Pattern

Proxy tasarım deseni, structural grubuna ait oluşturulması karmaşık veya oluşturulması zaman alan işlemlerin kontrolünü sağlar.


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.

UML şemamıza baktığımızda Subject, Real Subject birde Proxy sınıflarımızın olduğunu göreceksiniz. Client burda DO metodunun yaptığı işi istemektedir. Fakat bu metod uzun süren bir iş olabilir. Örneğin bir web sayfası ve bu metod büyük boyutlu bir resmi sayfaya yüklüyor. Proxy kullanılmaz ise bu metod çalıştırıldığında bu resim yüklenene kadar sayfanın geri kalan metodları çalışmaz ve sayfamız yavaş çalışır yüklenme süresi artar. Bu nedenle proxy pattern'i kullanarak bu yükleme esnasında sayfayı durdurmak yerine bir önizleme resmini ekrana yazdırabiliriz. Yükleme tamamlandığında ise yüklenen resim bu önizlemenin yerine geçer.

Şimdi Proxy tasarım desenini kullanarak basit bir image generator uygulaması geliştirerek bu sorunu nasıl ortadan kaldırabiliriz ona bakalım:

Yazdığımız uygulamanın Class Diagramı şöyle olacak:




Subject Interface:

    /// <summary>
    /// Subject Interface
    /// </summary>
    public interface IImageGenerator
    {
        void ShowImage();

    }


Real Subject Class:


    /// <summary>
    /// RealSubject Class
    /// </summary>
    public class ImageGenerator: IImageGenerator
    {
        public void ShowImage()
        {
            Console.WriteLine("Resim Gösteriliyor..");
        }

    }

Proxy Class:


    /// <summary>
    /// Proxy Class
    /// </summary>
    public class ImageGeneratorProxy: IImageGenerator
    {
        // Proxy class gerçekleştirilmek istenen işi yapar
        // İçerisinde Real Subject nesnesi barındırır.
        private ImageGenerator _imageGenerator;
        private Timer t;
        private bool LoadRealObject = false;

        private void ShowRealImage(object o)
        {
            _imageGenerator = new ImageGenerator();
            _imageGenerator.ShowImage();
            LoadRealObject = true;
        }

        public void ShowImage()
        {
            if (_imageGenerator == null)
            {
                //burada başka bir threadda asıl nesnenin yüklenmesi başlatılır.
                //burada test için bekleme süresi olarak 2000 verdiğimiz için
                //ShowRealImage çalışması bekleyecektir. Böylece önce ekrana önizleme gelecektir.
                t = new System.Threading.Timer(new TimerCallback(ShowRealImage), this, 2000, 0);
            }
            //eğer gerçek resim yüklemesi tamamlanmamış ise önizleme resmi gösterilsin
            if (!LoadRealObject)
                Console.WriteLine("Önizleme resmi gösteriliyor..");
        }

    }

Çıktı:



Gördüğünüz gibi test için koyduğumuz geçikme nedeniyle önce önizleme yazısı çıktı. Burada önemli olan bu geçikmede program beklemedi önizleme yazısını gösterdi. İşi tamamlanınca gerçek resmin yazısını gösterdi.

0 yorum :

Yorum Gönder