Nano'nun Günlüğü…

Ideallerimi gerceklestirmek icin arastiriyorum, Unutmamak icin yaziyorum!

  • Bulundugunuz Sayfa: 
  • Ana Sayfa
  • .Net ile Composite Design Pattern

.Net ile Composite Design Pattern

Gönderim Mayıs 11th, 2012

Bu yazimda sizlere yazilim tasarim desenlerinden birisi olan Composite Design Pattern’dan bahsediyor olacagim. Object Oriented programlama mantigina uygun olarak olusturulan bu tasarim kaliplari cok sik bir sekilde karsilasilan problemlere cozum olabilmesi icin en basarili yontem oldugu icin yazilim muhendisliginde onemli bir  rol almaktadir. Object Oriented programlama mantigi uzerinden dusunmeye devam edersek eger calistigimiz class’larin diger class’lar ile aralarinda ki bagin en aza indirilmesi gerektiginde veya programa yeni bir kod eklenmesi gerektiginde kullanilan kodlarin rahat bir sekilde anlasilmasi ve esnek bir sekilde algilaniyor olmasi gerekir. Iste bu ve bunun gibi durumlarda kullanacagimiz tasarim kaliplari ile yazilimimizin kalitesini arttirabiliriz.

Composite Design Pattern

Calisacagimiz bilgileri parca-butun iliskisine gore ayirmak istedigimizde bir agac hiyerarsisi yontemine basvurmamizi yonlendiren bir tasarim modelidir. Belli bir hiyerarsi yapisina gore nesneleri ele almaktadir.

Bunu yazilimdan bir ornek vererek aciklayacak olursak, en basitinden bir XML dokumanini ele alabiliriz.. XML dokumanlari, agac veri yapisinda hiyerarsik bir sekilde olusturulur ve kullanicilara verilerini listelerler. Aslinda karmasik bir kod yazimi gibi gozuksede gorunen dizindir, ve aslinda bir grafiktir…

Xml dokumanlari gibi, Active Directory gibi yapilarda Tree View kontrollerine bir ornek olabilir.

Bu tasarim deseninde asagida gordugunuz gibi bilinen uml semasi ile konuyu anlatmaya devam edecegimden dolayi uml diagraminda ki siniflardan vede metodlardan bahsedecek olursam, yine karsimiza 3 temel yapi cikmis oluyor.

Composite tasarim deseninde kullanacagimiz component nesnesi ve bunu implement edecek olan composite ve leaf nesneleri bulunmaktadir. Component tipindeki nesnemizin metodlari abstract yada virtual olarak tanimlanmalidir.

 

 

 

 

 

 

 

 

 

 

 

 

Component ; Nesneler icin bir arayuz olarak kullanilir. Kullanilacak tum siniflar icin ortak bir arayuz olmasi ile birlikte alt bilesenlere erisirken nesneleri ve metodlari da kendisinde barindirabilir, yani abstract yada interface olarak kullanilmaktadir. Bir nevi tanimlayici rolunu ustlenmektedir.

Composite ; Agac yapisindayken kendisinden tureyen nesnelerin bulundugu bir siniftir. Hiyerarsi icerisinde alt nesnelere sahiptir. Bilesik yapi rolunu ustlenmektedir.

Leaf ; Agac yapisindayken kendisinden herhangi bir nesne turemeyecek sekilde kullanilmaktadir. Hiyerarsi icerisindeyken alt nesnelere sahip olamamaktadir.

Client ; Olusturdugumuz nesneleri kullanmak icin talepte bulanacak olan istemci nesnemizdir.

Simdi dilerseniz ufak bir uygulama ile paylasmis oldugum bu bilgileri biraz daha detayli bir sekilde inceleyelim…

Oncelikle sizlere olusturacagim uygulamanin Uml diagrami olan Class diagramini paylasmak istiyorum ;

 

 

 

 

 

 

 

 

 

Bu class’larin icerigini asagida ki diagram’da daha detayli bir sekilde gorebilirsiniz ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Uygulama icerisinde kullanacagim Bolum enum sabitinin kod yapisi ;

 

 

 

 

 

Component yapisi icin olusturacagim Sirket abstract sinifinin yapisinin kod yapisi;

 

 

 

 

 

 

 

 

 

Leaf yapisina uygun olacak sekilde olusturulacak olan yazilim sinifinin kod yapisi;

 

 

 

 

 

 

 

 

 

Composite yapisi icin olusturdugum Kadro sinifinin kod yapisi ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Program.Cs Kaynak Kodu ;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Design_Pattern_MyComposite
{
enum bolum
{
ArGe,
Analist,
Test,
Senior,
Junior
}

abstract class Sirket
{
protected string isim;
protected bolum departman;

public Sirket(string _isim, bolum _departman)
{
this.isim = _isim;
this.departman = _departman;
}

public abstract void Ekle(Sirket ys);
public abstract void Sil(Sirket ys);
public abstract void Yazdir(int satirbasi);
}

class Yazilim : Sirket
{
public Yazilim(string isim, bolum departman)
: base(isim, departman)
{
}

public override void Ekle(Sirket t)
{
}

public override void Sil(Sirket t)
{
}

public override void Yazdir(int satirbasi)
{
Console.WriteLine(new String(‘-‘, satirbasi) + “> ” + isim + ” – ” + departman);
}
}

class Kadro : Sirket
{
private List<Sirket> liste = new List<Sirket>();

public Kadro(string isim, bolum departman)
: base(isim, departman)
{
}

public override void Ekle(Sirket u)
{
liste.Add(u);
}

public override void Sil(Sirket u)
{
liste.Remove(u);
}

public override void Yazdir(int satirbasi)
{
Console.WriteLine(new String(‘-‘, satirbasi) + “+ ” + isim + ” – ” + departman );

foreach (Sirket u in liste)
{
u.Yazdir(satirbasi + 2);
}
}
}

class MainApp
{
static void Main()
{
Kadro kadro1 = new Kadro(“Mary Jeys”, bolum.Senior);
kadro1.Ekle(new Yazilim(“Jhon Nick”, bolum.Analist));
kadro1.Ekle(new Yazilim(“Judy Cartin”, bolum.Junior));
kadro1.Ekle(new Yazilim(“Zoo King”, bolum.Test));

Kadro kadro2 = new Kadro(“Naiten Clark”, bolum.Analist);
kadro2.Ekle(new Yazilim(“Nelson Jack”, bolum.Junior));
kadro2.Ekle(new Yazilim(“Cary Notsel “, bolum.Junior));

kadro1.Ekle(kadro2);

Yazilim yzlm = new Yazilim(“Sely Whietiol”, bolum.Test);
kadro1.Ekle(yzlm);
kadro1.Sil(yzlm);

Kadro kadro3 = new Kadro(“Jason Outrin”, bolum.ArGe);
kadro3.Ekle(new Yazilim(“Ping Nite”, bolum.Analist));

kadro1.Yazdir(1);
kadro3.Yazdir(1);

Console.ReadKey();
}
}
}

Uygulamanin Ekran Goruntusu ;

 

 

 

 

 

 

Bir sonra ki design pattern cesitimiz ile gorusmek dilegiyle,

Keyifli calismalar dilerim…

Etiketler: , , ,
Bulundugu Konu Etiketleri Bilgisayar Mühendisi, Design Pattern, Genel, Visual Studio, Yazilim |

Lutfen Yorumlarinizi Burdan Ulastiriniz!...

You must be Kullanici Adiniz : to post a comment.

Istatistik

  • 1 Uye
  • 334 Yazi
  • 16 Yorum Var