Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

Design Pattern - Decorator



  May 11, 2019    Labels:,,,,,,,, 

Yazılım sistemimizi ihtiyaçlarımız doğrultusunda sınıflara bölerek tasarlarız ve bu sınıflara istediğimiz özellikleri veririz. Ancak bazı durumlarda sınıflardan ürettiğimiz nesnelerin farklı davranışlar sergilemesini isteyebiliriz. Bu probleme çözüm getiren kalıp Decorator Pattern'ıdır. Burada dikkat edilmesi gereken usun bu işlem çalışma zamanında yapılır ve sınıfta bir değişiklik yapılmaz. Sadece istenilen nesne üzerinde değişiklik yapılır ve o sınıftan üretilmiş diğer nesneler bu değişiklikten etkilenmezler. Örnek verecek olursak bir şekil arayüzümüzün olduğunu ve bu arayüzü kare, daire gibi sınıfların implement ettiğini düşünelim. Eğer kullanıcının seçtiği bir nesnenin renklendirilmesini istiyorsak o zaman sadece o nesneye dışarıdan ek özellik olarak bu durumu ekleyerek çizdirdiği şekli renkli hale getirebiliriz.

Uygulama
  • Component sınıfı ek özellik ekleyeceğimiz sınıfın arayüzü olmalıdır. Örneğimizde bu şekil arayüzüne denk gelmektedir.
  • ConcreteComponent sınıfı component arayüzünü implement eden ek özellik ekleyeceğimiz sınıflardır. Örneğimizde kare, daire gibi sınıflara denk gelmektedir.
  • Decorator sınıfımız bu patern'daki işlemleri yerine getirecek saf sanal sınıfımızdır. Bu sınıf ek özellik ekleyeceğimiz sınıfların arayüzünü implement etmeli ve ek özellik eklenecek nesneleri içermelidir.
  • ConcreteDecorator sınıfımız ek özellik ekleyeceğimiz nesnemize ekleyeceğimiz özellikleri belirttiğimiz sınıfımızdır.




interface Sekil {
    
    public void ciz();
}

class Kare implements Sekil {
    
    public void ciz() {
        System.out.println("Kare çizildi");
    }
}

class Daire implements Sekil {
    
    public void ciz() {
        System.out.println("Daire çizildi");
    }
}

abstract class SekilDecorator implements Sekil {
    protected Sekil decoratedSekil;
    
    public SekilDecorator(Sekil decoratedSekil) {
        super();
        this.decoratedSekil = decoratedSekil;
    }
} 

class BoyaDecorator extends SekilDecorator {
    protected String renk;
    
    public BoyaDecorator(Sekil decoratedSekil, String renk) {
        super(decoratedSekil);
        this.renk = renk;
    }
    
    public void ciz() {
        System.out.println(renk + " boyalı");
        decoratedSekil.ciz();
    }
}

public class Test {

     public static void main(String []args){
        Sekil kare = new Kare();
        kare.ciz();
        Sekil decoratedKare = new BoyaDecorator(new Kare(), "kırmızı");
        decoratedKare.ciz();
     }
}

Kare çizildi
kırmızı boyalı
Kare çizildi

No comments:

Post a Comment