Vitrin (Facade)

Eyl 08, 2013

Yapısal tasarım kalıplarından biri olan vitrin (facade) tasarım kalıbının temel amacı, var olan bir sistemi farklı açıdan ele alıp kullanılmasını kolaylaştırmak veya arayüzler kullanarak yüksek seviyedeki bir işi daha basit şekilde yapmak olarak açıklanabilir. Bu tasarım desenine göre programlama içerisinde sık kullandığımız işler için yüksek seviyeli bir arayüz tanımlayarak, sistemin daha kolay kullanılması sağlanır. 

Vitrin kalıbını kullanmanın faydaları temel olarak 5 basamakta incelenebilir.

  • Sistemi kullanmak çok daha basit bir hale gelir.
  • Yaratılan arayüz sayesinde programcının sistemi kontrol etme kabiliyeti artar.
  • Sisteme kullanıcılardan gelen ihtiyaçlar doğrultusunda yeni özellikler ekleme ve çıkarma işlemleri kolaylaşır.
  • Gelecekte çıkabilecek sorunlara karşı sistemi ayarlamak ve bakım yapma imkanı artar.
  • Sonradan sisteme katılacak yöneticiler için alt tarafta gelişen karmaşık olayları anlama gereksinimi doğurmaz, arayüzden gerekli işler yapılabilir.

Son olarak; vitrin kalıbını kullanmada temel amacın karmaşık sistemleri daha anlaşılır ve kolay hala getirmek olduğu unutulmamalıdır. Vitrin tasarımını kullandıktan sonra aynı işin daha az kod ve daha az satırda yapılabiliyor olması gerekmektedir. Ayrıca bu tasarımla ilgili dikkat edilmesi gereken en önemli kural, yaratılan arayüzün çıkarılması durumunda mevcut sistemin hala hatasız çalışabiliyor durumda olmasıdır. Arayüz sistem için bir olmazsa olmaz değil, sadece bir kolaylaştırıcı unsur olmalıdır.

Vitrin tasarım kalıbının çalışma şekli ile ilgili bir UML diyagramı:

 

Vitrin yapısına örnek uygulamada ana uygulama sınıfının içinde vitrin türünden bir arayüz tanımlanmış ve vitrin sınıfının içinde daha önceden tanımlanmış olan çeşitli alt sistem sınıfları çağırılmıştır. Böylece arayüz üzerinden bu alt sistemlerin bulunduğu metodlara erişme imkanı sağlanmıştır.

using System;

namespace OrnekFacadeYapisi
{

    class MainApp
    {

        public static void Main()
        {
            Facade arayuz = new Facade();

            arayuz.MethodA();
            arayuz.MethodB();

            Console.ReadKey();
        }
    }

    class SubSystemOne
    {
        public void MethodOne()
        {
            Console.WriteLine(" SubSystemOne Method");
        }
    }

    class SubSystemTwo
    {
        public void MethodTwo()
        {
            Console.WriteLine(" SubSystemTwo Method");
        }
    }

    class SubSystemThree
    {
        public void MethodThree()
        {
            Console.WriteLine(" SubSystemThree Method");
        }
    }

    class SubSystemFour
    {
        public void MethodFour()
        {
            Console.WriteLine(" SubSystemFour Method");
        }
    }

    class Facade
    {
        private SubSystemOne _one;
        private SubSystemOne _two;
        private SubSystemOne _three;
        private SubSystemOne _four;

        public Facade()
        {

            _one = new SubSystemOne();
            _two = new SubSystemTwo();
            _three = new SubSystemThree();
            _four = new SubSystemFour();
        }

        public void MethodA()
        {

            Console.WriteLine("\nMethodA() ---- ");
            _one.MethodOne();
            _two.MethodTwo();
            _four.MethodFour();
        }

        public void MethodB()
        {
            Console.WriteLine("\nMethodB() ---- ");
            _two.MethodTwo();
            _three.MethodThree();
        }
    }
}

Uygulamaya ait ekran çıktısı: