C# Composite Pattern Kullanımı - OOP Design Pattern
Composite tasarım deseni structual grubuna ait olup ağaç yapısında ki
nesne kalıplarının hiyerarşik olarak iç içe kullanılmasını düzenlemektir.
Dofactory.com a göre kullanım sıklığı %80 civarındadır yani sık kullanılan önemli
bir desendir.
Nesnelerin hiyerarşik yapısını askeriyeye veya bir şirketin
organizasyon ağacına benzetebiliriz. En üst rütbedeki bir asker emir verdiğinde
altındaki askerlerin hepsi bu emirden etkilenir. Bu desenin mantığıda bu
şekilde işliyor.
Composite tasarım deseninde 3 temel yapı vardır. Component
sınıfımız abstract veya interface olarak tanımlanabilir ve içinde property ve
operasyonların tanımları yapılır. Composite
ve Leaf sınıfları ise Component sınıfından
türeyen gerçek nesnelerdir. Farkları Composite, Component nesne sınıf listesi
barındırır içerisinde, Leaf ise altında nesneler olmayan alt katmandır.
Şimdi bir şirketin organizasyon ağacını ekrana yazdıran
basit bir console uygulaması geliştirelim.
Enum:
public enum Positions
{
CEO = 1,
GeneralManager = 2,
Manager = 3,
Employee = 4
}
Component:
public interface IComponentEmployee
{
string Name { get; set; }
string Surname { get; set; }
Positions Position { get; set; }
void PrintDetail();
}
Composite:
public class CompositeEmployee:IComponentEmployee
{
public string Name { get; set; }
public string Surname { get; set; }
public Positions Position { get; set; }
public List<IComponentEmployee> employeeList;
public CompositeEmployee(string name, string surname, Positions position)
{
this.Name = name;
this.Surname = surname;
this.Position = position;
employeeList = new List<IComponentEmployee>();
}
public void Add(IComponentEmployee employee)
{
employeeList.Add(employee);
}
public void Delete(CompositeEmployee employee)
{
employeeList.Remove(employee);
}
public void PrintDetail()
{
foreach (var employee in employeeList)
{
Console.WriteLine("Name :
" + employee.Name + " Surname: " +
employee.Surname + " Position: " + employee.Position.ToString());
}
}
}
Leaf:
public class LeafEmployee: IComponentEmployee
{
public string Name { get; set; }
public string Surname { get; set; }
public Positions Position { get; set; }
public LeafEmployee(string name, string surname, Positions position)
{
this.Name = name;
this.Surname = surname;
this.Position = position;
}
public void PrintDetail()
{
Console.WriteLine("Name :
" + this.Name + " Surname:
" + this.Surname + " Position:
" + this.Position.ToString());
}
}
Client:
static void Main(string[] args)
{
CompositeEmployee ceo = new CompositeEmployee("ceo name", "ceo surname", Positions.CEO);
CompositeEmployee generalManager = new CompositeEmployee("ceo name", "ceo surname", Positions.GeneralManager);
CompositeEmployee manager1 = new CompositeEmployee("manager1 name", "manager1
surname", Positions.Manager);
CompositeEmployee manager2 = new CompositeEmployee("manager2 name", "manager2
surname", Positions.Manager);
//genel
mudur ceonun altına eklendi
ceo.Add(generalManager);
//yoneticiler
genel müdürün altına eklendi
generalManager.Add(manager1);
generalManager.Add(manager2);
//yoneticilerin
altına calısanlar ekleniyor.
manager1.Add(new LeafEmployee("manager1 employee 1 Name", "manager1 employee 1
Surname", Positions.Employee));
manager1.Add(new LeafEmployee("manager1 employee 2 Name", "manager1 employee 2
Surname", Positions.Employee));
manager2.Add(new LeafEmployee("manager2 employee 1 Name", "manager1 employee 1
Surname", Positions.Employee));
manager2.Add(new LeafEmployee("manager2 employee 2 Name", "manager2 employee 2
Surname", Positions.Employee));
//ceo
altındaki calisan bilgileri
ceo.PrintDetail();
//genel
mudur altinda calisan bilgileri
generalManager.PrintDetail();
//yoneticiler
altındaki calisan bilgileri
manager1.PrintDetail();
manager2.PrintDetail();
Console.ReadLine();
}
Çıktı:
Kısa, öz ve güzel anlatım için teşekürler...
YanıtlaSil