şükela:  tümü | bugün
  • mevcut bir class'in bir metod'una bir özellik eklemek için kullanılan bir design pattern. adapter'dan farkı ise decorator'un etkilediği class'in metodun değişmemesidir.

    yani bir class'imiz var bu class bir interface'in drive metodunu implement ediyor olsun.

    decorator ile mevcut class'i bir field'de tutan abstract bir class'e atarız, bu da bir nevi bir placeholder class olur aslında. bu class'ten türeteceğimiz bir concrete class sayesinde mevcut class'in metoduna eklemeler yapabiliriz.

    güzel bir örnek (ki özcan acar'ın kitabında verdiği örneğe oldukça paralel bir örnektir) aşağıda bulunmakta;

    http://www.tutorialspoint.com/…ecorator_pattern.htm
  • bu pattern'i sıklıkla kullanmanın sıkıntısı kullanıcının kafasını bulamaktır. yani bir işlevi yerine getiren bir sınıfımız olsun ve işlev interface ile tanımlansın mesela, 25 tane concrete decorator sınıfı ile bu sınıfı wrap edip aynı işlevin 25 ek versiyonunu yaparsanız, bu durumda kullanıcıya sunu sunmuş olursunuz;

    interface'imiz sandwich mesela, bunu implement eden ana sınıf da simplesandwich;

    sandwich hayvanatsandwich = new meatdecorator(new dressingdecorator(new hededecorator( new hododecorator(......... (new simplesandwich())...);
  • ayrıca creational pattern gibi algılanabilir, halbuki structural pattern'dir. amacı, srp kuralına uygun bir şekilde bir işlevi gerçekleştiren bir sınıfı composition kullanarak (bkz: inheritance) wrap edip işlevi override etmek suretiyle istenilen amaca göre değiştirmek, yeni özellikler eklemektir.

    (bkz: single responsibility principle) (bkz: solid) (bkz: oop)
  • oop olmayan pythonic implementasyonu function decorator olan tasarım desendir.
  • mevcud bir class a farklı özellik eklemek için kullanılan patterndir. adapter ile çok karıştırılır. bu patternde mevcud class kapsüle edilmez. mevcud class dış dünyadan gizlenmez. en temel kullanımı mevcud classtan türetilen yeni bir decorator classı oluşturularak yapılır.
    adapter ya da proxy de esas oğlan classın instance ı adapter ya da proxy class ı içinde gizlenir dış dünyadan görülmez.

    edit : imla
  • design patterns in abap objects adlı kitapta sap abap uygulaması öğrenilebilecek pattern.

    özetle; birden fazla şekilde müdahale edilmesi gereken bir değişkenimiz var diyelim. müdahale edecek sınıfları zincir gibi uç uca dizip, değişeni her birine ayrı ayrı gönderiyoruz. hepsinden geçtiğinde, değişken son değerini / halini almış oluyor. tabii değişken yerine bir nesne de gönderilebilir.

    bunun tipik bir örneği, online pizza mağazasıdır. ziyaretçi pizzaya malzeme ekledikçe, pizza görselini malzeme sınıflarından geçire geçire üzerine eklenen malzemelerin görsellerini ilave ederiz.
  • bu tasarım kalıbının neden kullanıldığına ilişkin sıklıkla yapılan hata, sanki mevcut sınıfın üye fonksiyonuna* yalnızca yeni bir özellik eklemek olduğu yanılgısıdır. eğer amaç sadece bu olsaydı, statik zamanda mevcut sınıftan başka bir sınıf türetilerek ve ilgili method override edilerek de gerçeklenebilirdi.

    decorator pattern'in esas kullanım mantığı, bir sınıf nesnesine çalışma zamanında dinamik olarak sorumluluk* ekleyebilmektir. bunu sağlayabilmek için de ilgili sınıf en içte kalacak biçimde, yeni sorumlulukları temsil eden sınıf nesnelerinin üst üste katmanlar biçiminde bu sınıf nesnesini sarmasıdır. nitekim, decorator pattern'in bir diğer adı da wrapper'dır. sarmalanan sınıf nesnesi, karakteristik davranışından herhangi bir şey kaybetmez. en dıştaki katmana gelen bir mesaj, katmanlar arasında iletilerek en içteki nesneye yani dekore edilmek istenen sınıf nesnesine kadar ulaştırılır. bu sayede her katman kendine gelen isteği bir sonraki katmana iletirken, ek olarak kendi sorumluluğunu da gerçekleştirmiş olur. ve bütün bunlar çalışma zamanında dinamik olarak gerçekleştirilir (bunu bazı programlama dillerinde statik zamanda yapmanın yolları da mevcuttur). ayrıca dekoratör tasarım kalıbı bariz bir biçimde yapısaldır *, sorumluluk sahibidir ve rengârenktir.

    (bkz: dekorasyon günahları)
  • abap diliyle uygulanmış bir örnek, detaylı açıklamasıyla birlikte https://peloton4.com/…/27/decorator-design-pattern/ adresinde görülebilir.