Decorator Patern (Dekoratör örüntüsü)

Mustafa Erdem Köşk - 13/06/2017
decorator-patern-dekorator-oruntusu

Herkese merhaba !

Is yerinde ve yüksek lisans egitiminde sik sik karsima çikan design paternleri (yazilim örüntüleri) sizlere ögretici olmasi açisindan , kisisel olarakta ögrendiklerimi pekistirmek adina düzenli olarak yazilim paternlerini anlatacagim. Bugün Decarator patern (Dekoratör örüntüsü) ile karsinizdayim.

 

  • Dekoratör örüntüsü bir nesneye, yapisini değiştirmeden yeni işlev kazandirmak için kullanilan bir yazilim örüntüsüdür. İlgili nesne, bir dekoratör nesnesi ile çerçevelenir. Bu sayede bu nesne farkli özellikleri kullanabilme becerisi elde etmis olur.

 

Bu paternin temel olarak 3 bölümü bulunmaktadir.

 

 

Somut Sinif: Çerçevelenecek asil sinif budur. Temel işlevler burada yerine getirilir.

 

Dekorato¨r: Ek işlevler bu dekoratör sinifinda yer alir. Ancak bu sinifin Somut Sinif nesnesine ve is¸levlerine de bu sinifin erişmesi gerekmektedir. Bunun için bir soyut Abstract sinif yada Interface sinifi kullanilir.

 

Abstract sinif yada Interface: Somut Sinif ve Dekoratör siniflari bu arayüzü gerçekleştirirler. Dekoratör sinifi bu arayüzü kullanarak Somut Sinif'i kullanir.

 

Bu konunun daha iyi anlasilmasi adina sizlere gerçek hayatta bu paternin nasil kullanilabilecegini gösteren basit bir pizza programi gösterecegim.

 

 public abstract class Pizza
    {
        public abstract double CalculatePrice();
        public void ShowPizzaCost(Pizza pizza)
        {
            Console.WriteLine("Pizza Ismi " + pizza.GetType().Name +" Fiyati" + pizza.CalculatePrice());
        }
    }
 public class ThinCrust : Pizza
    {
        private double price = 30;

        public override double CalculatePrice()
        {
            return price;
        }
    }
 public class PizzaDecorator : Pizza
    {
        // bu sinif gelecek olan pizza çesitlerine göre pizza ücreitni hesaplar.
        Pizza basePizza = null;

        protected double pizzaCost = 0.0;

        protected PizzaDecorator(Pizza objPizza)
        {
            basePizza = objPizza;
        }
        public override double CalculatePrice()
        {
            return pizzaCost + basePizza.CalculatePrice();
        }
    }
  public class MixPizzaDecorator : PizzaDecorator
    {
      
        public MixPizzaDecorator(Pizza objPizza) : base(objPizza)
        {
            this.pizzaCost = 50;
        }

    }

 

Yukarida verdigim kod örneklerinde kalin kenarli yada ince kenarli pizzanin kendine ait bir fiyati bulunmaktadir. Abstract sinifta bulunan bir method decorator sayesinde pizza çesitlerinde degisim göstermektedir. Simdi siniflari çagiralim.

 

 static void Main(string[] args)
        {
            Thincrust thinPizza = new Thincrust();
            thinPizza.ShowPizzaCost(thinPizza);
            MixPizzaDecorator mixandThinPizza = new MixPizzaDecorator(thinPizza);
            mixandThinPizza.ShowPizzaCost(mixandThinPizza);

            Console.ReadLine();
        }

 

Programin çiktisi ise su sekilde olacaktir

 

Pizza Ismi Thincrust Fiyati 30
Pizza Ismi MixPizzaDecorator Fiyati 80