Merhaba Değerli Java dostları,
Bugünkü yazımda composite design pattern üzerinde durmak istiyorum. Composite design pattern, aslında bir sistem ve bileşenleri arasındaki hiyerarşik durum problemine çözüm olarak gelmektedir. Kütüphaneyi kullanan kullanıcı açısından bakarsak sistemin parçaları arasında fark yoktur. Bu durum aslında bize interface veya abstract yapı kullanmamız gerektiğini vurgular. Composite design pattern bize bir ağaç yapısı sunar. Dolayısıyla rekürsif bir yapında söz edebiliriz.
Composite design pattern için bilmemiz gereken iki temel tanım vardır.
Bunlar;
Component: Alt bileşenleri olmayan bileşen.
Composite: Alt bileşenleri mevcut olan bileşendir.
Aslında tanım içerisinde iki defa bileşen kullanmamız burada rekürsif bir olay olduğunu da belirtiyor.
İsterseniz hemen kodumuza geçelim.
package designpattern.composite; public interface IEmployee { public boolean addEmployee(IEmployee employee); public boolean removeEmployee(IEmployee employee); public String getInfo(); } |
package designpattern.composite;public class Developer implements IEmployee { private String info = “”; public Developer(String info) { this.info = info; } @Override public boolean addEmployee(IEmployee employee) { return false; } @Override public boolean removeEmployee(IEmployee employee) { return false; } @Override public String getInfo() { return info; } } |
package designpattern.composite;import java.util.HashSet; import java.util.Set;public class Manager implements IEmployee { private String info = “”; private Set employeeList = null; public Manager(String info) { this.info = info; employeeList = new HashSet(); } @Override public boolean addEmployee(IEmployee employee) { return employeeList.add(employee); } @Override public boolean removeEmployee(IEmployee employee) { return employeeList.remove(employee); } @Override public String getInfo() { StringBuffer buffer = new StringBuffer(); buffer.append(info).append(“: “); for (IEmployee employee : employeeList) { buffer.append(” “).append(employee.getInfo()); } return buffer.toString(); } } |
package designpattern.composite;import java.util.HashSet; import java.util.Set;public class Ceo implements IEmployee { private String info = “”; private Set employeeList = null; public Ceo(String info) { this.info = info; employeeList = new HashSet(); } @Override public boolean addEmployee(IEmployee employee) { return employeeList.add(employee); } @Override public boolean removeEmployee(IEmployee employee) { return employeeList.remove(employee); } @Override public String getInfo() { StringBuffer buffer = new StringBuffer(); buffer.append(info).append(“: “); for (IEmployee employee : employeeList) { buffer.append(” “).append(employee.getInfo()); } return buffer.toString(); } } |
package designpattern.composite;public class CompositeMain { public static void main(String[] args) { IEmployee developer1 = new Developer(“Developer1”); IEmployee developer2 = new Developer(“Developer2”); IEmployee developer3 = new Developer(“Developer3”); IEmployee manager1 = new Manager(“Manager1”); IEmployee manager2 = new Manager(“Manager2”); IEmployee ceo = new Ceo(“CEO”); manager1.addEmployee(developer1); manager1.addEmployee(developer2); manager2.addEmployee(developer3); ceo.addEmployee(manager1); ceo.addEmployee(manager2); System.out.println(ceo.getInfo()); } } |
Öncelikle şunu belirtmem gerekir ki burada kod tekrarını önlemek adına abstract/inheritance yapı kullanılabilir. Gördüğünüz gibi CEO altında manager, manager altında ise developer nesneleri mevcuttur. Eğer biz bu kodu kütüphane haline getirip istemciye sunmuş olsaydık, istemci açısından nesneler arasında bir fark olmayacaktı; çünkü implemente ettikleri yapı aynı. Her rekürsif ve ağaç yapısında olduğu gibi burada da aşırı kalabalık ve karışık bir yapı, bakımı zor maliyeti yüksek durumlar oluşturabilir. Bundan dolayı composite design pattern kullanılırken bu maliyet/fayda oranı iyi düşünülmelidir.
Bol Java’ lı günler dileğiyle…
Yazan: Faruk BOZAN