Welcome to My Blog 👋

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

Design Pattern - Composite



  May 19, 2019    Labels:,,,,,,,, 

Günlük hayatta ve yazılım sistemlerinde genellikle varlıklar alt varlıklardan oluşur. Örneğin bir ülke içinde illeri onlar ilçeleri onlar da köyleri barındırırlar. Ülkede yaşanan herhangi bir gelişme onun içerisinde bulunduğu diğer alt varlıkları da etkiler. Bu durum günlük hayatta olduğu gibi yazılım sistemlerinde de vardır. Örneğin bir masaüstü uygulamada window açtığınızda bu window'un içinde resim ve yazılar olmaktadır. Bunlar da image ve label view'ları gibi alt varlıklar olabilirler. Window'un boyutunu değiştirdiğimiz zaman içinde bulunduğu yazı ve resimlerinde aynı şekilde boyutunun değiştiğini gözlemleyebiliriz. Bu problem yazılım sistemlerinde sıklıkla karşılaşılan bir problemdir. İç içe bulunan varlıkların tümü için tek tek yapılan değişikliğin yansıtılması yanlış bir yöntemdir ve işin içinden çıkılamayacak problemler ortaya çıkarır. Bu problemlerin çözümü için sunulan kalıplaşmış yöntem Composite Pattern'ıdır. Bu patern ile iç içe bulunan nesnelerin tümüne istenilen değişiklik tek bir noktadan uygulanır.

Uygulama
  • Component arayüzü iç içe bulunacak varlıklar için bir arayüz oluşturur ve operation metodu ortak işlemler için kullanılacak metotları temsilen yazılmıştır. Örneğimizde genel ön yüz elemanlarının arayüzüdür.
  • Composite sınıfı içerisine alt varlıklar alabilecek sınıfları temsil eder. Örneğimizde window sınıfıdır.
  • Leaf sınıfı içerisine bir alt varlık eklenemeyecek olan sınıfları temsil eder. Örneğimizde image sınıfıdır.


import java.util.ArrayList;

abstract class Component {
    protected String name;
    protected Boolean isParent;
    protected Component parent;
    protected ArrayList children;
    
    protected Component(String name, Boolean isParent) {
        this.name = name;
        this.isParent = isParent;
        if(isParent) {
            children = new ArrayList<>();
        }
    }
    
    public void add(Component component) throws Exception {
        if(isParent) {
            children.add(component);
        } else {
            throw new Exception("Bu işlem desteklenmiyor");
        }
    }
    
    public void remove(Component component) throws Exception {
        if(isParent) {
            children.remove(component);
        } else {
            throw new Exception("Bu işlem desteklenmiyor");
        }
    }
    
    public abstract void resize();
}

class Panel extends Component {
    
    public Panel(String name) {
        super(name, Boolean.TRUE);
    }
    
    public void resize() {
        System.out.println(name + " panelinin boyutu değişti!");
        if(!children.isEmpty()) {
            for(Component component : children) {
                component.resize();
            }
        }
    }
}

class ImageView extends Component {
    
    public ImageView(String name) {
        super(name, Boolean.FALSE);
    }
    
    public void resize() {
        System.out.println(name + " resminin boyutu değişti!");
    }
}

public class HelloWorld{

     public static void main(String []args) throws Exception{
        Panel panel = new Panel("Panel1");
        ImageView image1 = new ImageView("Image1");
        ImageView image2 = new ImageView("Image2");
        panel.add(image1);
        panel.add(image2);
        panel.resize();
     }
}

Panel1 panelinin boyutu değişti!
Image1 resminin boyutu değişti!
Image2 resminin boyutu değişti!

1 comment:

  1. Do this hack to drop 2lb of fat in 8 hours

    Over 160k men and women are losing weight with a easy and SECRET "liquid hack" to lose 1-2lbs each night while they sleep.

    It's scientific and it works on anybody.

    Here's how to do it yourself:

    1) Hold a clear glass and fill it up with water half the way

    2) Proceed to do this proven HACK

    and become 1-2lbs thinner in the morning!

    ReplyDelete