Bileşik Örüntü Nedir?
- Yapısal bir tasarım örüntüsüdür.
- Nesnelerin parça-bütün ilişkisi içinde ağaç yapısı ile bir araya getirilerek bileştirilmesine ve bu bileşiğe tek arayüzden ulaşılmasına olanak sağlar.
- Bileşik yapı yeni nesneler eklenip çıkarılarak zamanla genişleyip daralabilir.
Neden Bileşik Örüntü Kullanılır?
Çizim editörleri ya da PCB tasarım editörleri benzeri programlar kullanıcılarına basit temel parçalar üzerinden karmaşık yapıları oluşturma imkanı verirler. Örneğin bir katı hal modelleme programında bir küp oluşturmak için kareler gruplanabilir ya da en ilkel yapı olan çizgiler birleştirilerek bu şekil oluşturulabilir. İki durumda da küp oluşturulmuş fakat farklı elemanlar kullanılarak oluşturulmuştur. Normal bir durumda çizgiler ile oluşturulmuş bir küpün bütün kenarlarına ayrı ayrı ulaşılabilirken, kare ile oluşturulmuş bir küpün sadece yanal alanlarına ulaşılabilir. Bu durum yazılım aşamasını zorlaştırmakta ve kodu daha zor bir hale getirmektedir. Bileşik örüntü tam da bu noktada devreye girerek benzer elemanların ortak özelliklerinin gruplanması kullanılan elemanların olabildiğince ilkel seviyelere indirgenebilmesi ve oluşturulacak karmaşık yapıların ilkel elemanlar ile özyinelemeli şekilde oluşturulması görevini üstlenmektedir.
Bileşik Örüntü UML Diyagramı
- Bileşik örüntünü anahtar elemanı UML diyagramda görülen abstract Graphic sınıfıdır.
- Graphic sınıfı hem Draw () metodu gibi farklı şekilller için değişen metodları hem de tüm bileşen şekillerin kendi alt sınıflarına erişmek için kullandıkları metodları tanımlar.
- Line, Rectangle, ve Text alt sınıfları ilkel grafiksel nesleri tanımlar.
- Bu sınıflar çizgi çizme, üçgen oluşturma ve karakter girmek gibi işlemleri yerine getirirler ve alt sınıfları bulunmaz.
- Picture sınıfı Graphic nesnleri arasındaki ilişkiyi tanımlar.
- Picture sınıfı Draw metodunu uygulamak için ilgili alt sınıfın Draw metodunu çağırır ve istenilen grafik oluşturuluna kadar özyinelemeli olarak ilgili alt sınıfları çağırmaya devam eder.
Özyinelemeli Olarak Oluşturulan Bileşik Nesne Yapısı
Bileşik Örüntü Nerelerde Kullanılır?
- Nesneler arasında parça bütün ilişkisi oluşturulmak istendiğinde,
- Kullanıcıların benzer bileşenler ve özgün nesneler arasındaki küçük farklılıkları görmezden geldiği durumlarda,
- Bileşik tasarım örüntüsü kullanılarak yazılacak kod sadeleştirilebilir.
Bileşik Örüntü Yapısı
Component (Graphic)
- Bileşim içerisinde bulunan nesnlere için arayüzü tanımlar,
- Tüm sınıflarda ortak olduğu varsayılan davranışları uygular,
- Bileşenlerin alt sınıfları erişmek ve yönetmek için gerekli arayüzü oluşturur,
- Opsiyonel olarak oluşturulan sınıfların üst sınıflarına erişmek için kullanılacak arayüzü tanımlar.
Leaf (Rectangle, Line, Text, vb.)
- Bileşim içerisindeki ilkel sınıfları tanımlar, bu sınıfların alt sınıfları yoktur,
- Bileşim içersindeki ilkel sınıfların davranışlarını tanımlar.
Composite (Picture)
- Alt sınıfa sahip olan bileşenlerin davranışlarını tanımlar,
- Alt sınıfları yönetir,
- Oluşturulan alt sınıfları tutar.
Client
- Sistemi harekete geçiren kullanıcı arayüzüdür.
Bileşik Örüntü Nasıl Çalışır? ( How Composite Pattern Works)
- Kullanıcı bileşik yapı ile iletişime geçmek için bileşen sınıfını kullanır.
- Eğer kullanılmak istenen yapı ilkel bir yapı ise doğrudan iletişim sağlanır.
- Kullanılmak istenen yapı bileşik bir yapı ise bileşen sınıfı tarafından ilgili bileşik alt sınıf çağırılır.
Kısaca...
- Bileşik yapı benzer nesnlerin ortak özelliklerini kullanarak daha ragat yönetilebilir bir yapı oluşturmaktadır. Bu şekilde benzer nesnelerin ayrı ayrı tanımlanması önlenmekte ve kod içerisinde esneklik sağlnamaktadır.
- Bu örüntü kullanılarak oluşturulan bir sistemde eleman ekleme ve çıkarma işlemleri kolaylıkla yapılabilemketedir.
- Bileşik yapı içerisinde olabildiğince ilkel nesnler kullanılarak daha karmaşık yapıların oluşturulması sağlanabilmektedir.
- Bu şekilde bir yapı ile kullanıcı tarafından oluşturulmak istenen grafik ya da benzeri bir yapı için standart işlemlerin yapılması, kullanıcı arayüzünü de basitleştirmektedir.
- Yeni eleman ekleme ve çıkarma işlemleri daha kolay halledilebilemketedir.
- Dezavantaj olarak yeni eklenecek bir eleman için uygun ortak özellikler olmadığında ya da sistem içerisinde bütün elemanların özelliklerinin tam olarak yansıtılmak istendiği durumlarda karşılaşacağınız zorluklar gösterilebilir.
İlişkili Tasarım Örüntüleri ( Related Patterns )
- Sıklıkla Bileşen – Ata bağlantısı Chain Of Responsibility tarafından kullanılır,
- Decorator ile ibrlikte sıklıkla kullanılır. Decorator ile birlikte kullanıldığında genellikle aynı üst sınıfı kullanırlar. Bileşik örüntünün Add, Remove ve GetChield gibi methodları Decorator tarafından desteklenmelidir.
- Flyweight ile ortak bileşik sınıflar kullanılır fakat aynı ata sınıfa ait değildirler.
- Iterator bileşikler arasında geçiş için kullanılabilir.
- Visitor, Bileşik ve ilkel sınıflar arasında dağıtılacak davranışları lokalize etmek için kullanılır.
Örnek Kod ( Sample Code )
/* Component */
interface Graphic
{
//Prints the graphic.
public void print();
}
/* Leaf */
class Ellipse implements Graphic
{
//Prints the graphic.
public void print()
{
System.out.println("Ellipse");
}
}
/* Composite */
import java.util.List;
import java.util.ArrayList;
class CompositeGraphic implements Graphic
{
//Collection of child graphics.
private List<Graphic> childGraphics = new ArrayList<Graphic>();
//Prints the graphic.
public void print()
{
for (Graphic graphic : childGraphics)
{
graphic.print();
}
}
//Adds the graphic to the composition.
public void add(Graphic graphic)
{
childGraphics.add(graphic);
}
//Removes the graphic from the composition.
public void remove(Graphic graphic)
{
childGraphics.remove(graphic);
}
}
/* Client */
public class Program
{
public static void main(String[] args)
{
//Initialize four ellipses
Ellipse ellipse1 = new Ellipse();
Ellipse ellipse2 = new Ellipse();
Ellipse ellipse3 = new Ellipse();
Ellipse ellipse4 = new Ellipse();
//Initialize three composite graphics
CompositeGraphic graphic = new CompositeGraphic();
CompositeGraphic graphic1 = new CompositeGraphic();
CompositeGraphic graphic2 = new CompositeGraphic();
//Composes the graphics
graphic1.add(ellipse1);
graphic1.add(ellipse2);
graphic1.add(ellipse3);
graphic2.add(ellipse4);
graphic.add(graphic1);
graphic.add(graphic2);
//Prints the complete graphic (four times the string "Ellipse").
graphic.print();
}
}
Hiç yorum yok:
Yorum Gönder