C#'ta Composite Design Pattern

C#'ta Composite Design Pattern kullanımı ele alacağız.

Composite Design Pattern, Structural Patterns gurubunda yer almaktadır.

Bir yapıyı oluşturan nesneler topluluğunda yapıyı oluşturan parçaları ağaç (tree) hiyeraşik yapısına göre oluşturan ve aralarındaki ilişkiler için düzen sağlayan bir tasarım desenidir.

Hiyeraşik Yapı : Bir toplulukta veya bir kuruluşta yer alan kişileri alt-üst ilişkileri, görev ve yetkilerine göre sınıflandıran sistem olarak tanımlanır. Xml, Html Dom, Tree View kontrolü, Active Directory gibi yapılar kullanım yerleri açısından örnek olarak gösterilebilir.

  • Client: İstemci uygulama
  • Component: Composite ve Leaf için tanımlanacak ortak şablon abstract class yada interface olacak.
  • Leaf: Yapı içerisindeki nesnelerin davranışlarını tanımlayan Leaf nesnelerini sunan yapı.
  • Composite: İçerisinde Composite ve Leaf nesnelerini tutan yapı.

Biz örneğimizde Windows Form uygulamaları yapısını konumuz ile ilişkilendirmeye çalışacağız. Bir Composite Root tanımlanacak bu Root altına Leaf tipinden elemanlar eklenecek. Daha sonra Composit tipli nesneler üretilecek. Bunların içerisine Leaf tipli elemanlar eklenecek ve daha sonra Composit tipli oluşturulan container nesneler Root Composite içerisine eklenecek.

Aşağıdaki şekil bu tanımı örneklendiriyor.

+Form (Root) (Composite)

....TextBox (Leaf)

....TextBox (Leaf)

....Button (Leaf)

....Panel (Composite)

..........TextBox (Leaf)

..........TextBox (Leaf)

....Panel (Composite)

..........TextBox (Leaf)

..........TextBox (Leaf)

....Button (Leaf)

namespace ConsoleApplication1

{

public enum KontrolTip

{

Form, Panel, TextBox, Button,

}


//Component

abstract class Kontrol

{

public string _id; public string _text; public KontrolTip _tip;


public Kontrol(string id, string text, KontrolTip tip)

{

_id = id;

_text = text;

_tip = tip;

}


public abstract void Ekle(Kontrol uye); public abstract void Sil(Kontrol uye);

public abstract void Goster(int satirBosluk);

}


//Leaf

class LeafKontrol : Kontrol

{

public LeafKontrol(string id, string text, KontrolTip tip)

: base(id, text, tip)

{

//Leaf için kullanılmaz

}

public override void Ekle(Kontrol kontrol)

{

//Leaf için kullanılmaz

}


public override void Sil(Kontrol kontrol)

{

//Leaf için kullanılmaz

}

public override void Goster(int satirBosluk)

{

Console.WriteLine(new String('.', satirBosluk) + " " + _id + " " + _text);

}

}


//Composite

class CompositeKontrol : Kontrol

{

//Composite tip içinde tutulacak componentler için generic list private List<Kontrol> _kontroller = new List<Kontrol>();


public CompositeKontrol(string id, string text, KontrolTip tip)

: base(id, text, tip)

{

}


public override void Ekle(Kontrol uye)

{

_kontroller.Add(uye);

}


public override void Sil(Kontrol uye)

{

_kontroller.Remove(uye);

}


public override void Goster(int satirBosluk)

{

Console.WriteLine(new String('.', satirBosluk) + "+ " + _id + " " +

_text);


foreach (Kontrol kontrol in _kontroller)

{

kontrol.Goster(satirBosluk + 1);

}

}

}


//Client class Program

{

static void Main(string[] args)

{

CompositeKontrol cKontrolRoot = new CompositeKontrol("Form1", "WinApplication 1", KontrolTip.Form);

cKontrolRoot.Ekle(new LeafKontrol("TextBox1", "Adınızı Giriniz...", KontrolTip.TextBox));

cKontrolRoot.Ekle(new LeafKontrol("TextBox2", "Soyadınız Giriniz...", KontrolTip.TextBox));

cKontrolRoot.Ekle(new LeafKontrol("Button1", "Kontrol Et", KontrolTip.Button));


CompositeKontrol cKontrol1 = new CompositeKontrol("Panel1", "Adres Bilgileri", KontrolTip.Panel);

cKontrol1.Ekle(new LeafKontrol("TextBox4", "Adres Satır 1", KontrolTip.TextBox));

cKontrol1.Ekle(new LeafKontrol("TextBox5", "Adres Satır 2", KontrolTip.TextBox));

cKontrolRoot.Ekle(cKontrol1);


CompositeKontrol cKontrol2 = new CompositeKontrol("Panel2", "Telefon Bilgileri", KontrolTip.Panel);

cKontrol2.Ekle(new LeafKontrol("TextBox6", "Telefon 1", KontrolTip.TextBox));

cKontrol2.Ekle(new LeafKontrol("TextBox7", "Telefon 2", KontrolTip.TextBox));

cKontrolRoot.Ekle(cKontrol2);


cKontrolRoot.Ekle(new LeafKontrol("Button2", "Gönder", KontrolTip.Button));

cKontrolRoot.Goster(1); Console.Read();

}

}

}

Ekran Çıktısı


.+ Form1 WinApplication 1

.. TextBox1 Adınızı Giriniz...

.. TextBox2 Soyadınız Giriniz...

.. Button1 Kontrol Et

..+ Panel1 Adres Bilgileri

... TextBox4 Adres Satır 1

... TextBox5 Adres Satır 2

..+ Panel2 Telefon Bilgileri

... TextBox6 Telefon 1

... TextBox7 Telefon 2

.. Button2 Gönder

 

Ozan Dalbudak
Merhaba,1995 doğumluyum. 2009 yılında lisede veritabanı Programcılığı bölümünü kazanarak kariyerime başlamış oldum. Daha sonra Selçuk Üniversitesi'nde Bilgisayar Mühendisliği okuyorum.
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git