Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...
C# Composite Design Pattern(Composite Tasarım Deseni)
Yazar:
Gençay
·
08 Kasım 2021
SENARYO 5
Bir firma aylık olarak personellerine ödediği maaşların raporlanabileceği bir uygulama istemektedir. Firma bünyesinde aşağıdaki gibi bir hiyerarşi mevcuttur;
Bu hiyerarşide; genel müdürlüğe bağlı müdürlükler, müdürlüklere bağlı bölgeler, bölgelere bağlı bayiler ve son olarak bu bayilerde çalışan personeller olduğu görülmektedir.
Firma maaş hesaplamayı, hem tüm şirket için genel olarak hem de hususi müdürlük, bölge, bayi gibi farklı hiyerarşi seviyeleri için özel olarak istemektedir.
ÇÖZÜM
Adım 1 (Component Soyut Sınıfının Tasarlanması)
//Component
abstract class Personnel
{
protected string _name;
public double Salary { get; set; }
protected Personnel(string name)
{
_name = name;
}
public virtual double ComputeSalary()
{
Console.WriteLine($"{_name} -> Price : {Salary}");
return Salary;
}
}
//Component
abstract class PersonnelComposite : Personnel
{
protected List<Personnel> _personnels = new();
protected PersonnelComposite(string name) : base(name)
{
}
public void AddPersonnel(Personnel personnel)
=> _personnels.Add(personnel);
public void RemovePersonnel(Personnel personnel)
=> _personnels.Remove(personnel);
public override double ComputeSalary()
{
double totalSalary = 0;
foreach (Personnel personnel in _personnels)
totalSalary += personnel.ComputeSalary();
Console.WriteLine($"{_name} Total Salary : ${totalSalary}");
Console.WriteLine("******************");
return totalSalary;
}
}
Adım 2 (Composite Sınıfının Tasarlanması)
//Composite
class GeneralDirectorate : PersonnelComposite
{
public GeneralDirectorate(string name) : base(name)
{
}
}
//Composite
class Director : PersonnelComposite
{
public Director(string name) : base(name)
{
}
}
//Composite
class Area : PersonnelComposite
{
public Area(string name) : base(name)
{
}
}
//Composite
class Seller : PersonnelComposite
{
public Seller(string name) : base(name)
{
}
}
Adım 3 (Leaf Sınıfının Tasarlanması)
//Leaf
class Worker : Personnel
{
public Worker(string name) : base(name)
{
}
}
Adım 4 (Test)
static void Main(string[] args)
{
//İşçiler tanımlanıyor
Worker personnel1 = new("Ahmet") { Salary = 10000 };
Worker personnel2 = new("Mehmet") { Salary = 8000 };
Worker personnel3 = new("Necati") { Salary = 12000 };
Worker personnel4 = new("Hilmi") { Salary = 7000 };
Worker personnel5 = new("Rıfkı") { Salary = 3000 };
Worker personnel6 = new("Muiddin") { Salary = 2500 };
Worker personnel7 = new("Rauf") { Salary = 13000 };
Worker personnel8 = new("Şuayip") { Salary = 15000 };
//Bayiler tanımlanıyor
Seller seller1 = new("Yenimahalle Bayi");
Seller seller2 = new("Çankaya Bayi");
Seller seller3 = new("Bahçelievler Bayi");
//İşçiler çalıştıkları bayilere ekleniyor
seller1.AddPersonnel(personnel1);
seller1.AddPersonnel(personnel2);
seller1.AddPersonnel(personnel3);
seller2.AddPersonnel(personnel4);
seller2.AddPersonnel(personnel5);
seller2.AddPersonnel(personnel6);
seller3.AddPersonnel(personnel7);
seller3.AddPersonnel(personnel8);
//Bölgeler tanımlanıyor
Area area1 = new("Ankara Bölgesi");
Area area2 = new("İstanbul Bölgesi");
//Bölgelere bayiler ekleniyor
area1.AddPersonnel(seller1);
area1.AddPersonnel(seller2);
area2.AddPersonnel(seller3);
//Müdürler tanımlanıyor
Director director1 = new("Kuzey Grubu Müdürü");
Director director2 = new("Güney Grubu Müdürü");
//Müdürlere bölgeler ekleniyor
director1.AddPersonnel(area2);
director2.AddPersonnel(area1);
//Genel müdür tanımlanıyor
GeneralDirectorate generalDirectorate = new("Genel Müdür");
//Genel müdüre müdürler ekleniyor
generalDirectorate.AddPersonnel(director1);
generalDirectorate.AddPersonnel(director2);
generalDirectorate.ComputeSalary();
}
Sonuç :
İyi çalışmalar…
Etiketler: C# Composite D. P. C# Composite Design Pattern Composite Composite Design Pattern Composite Tasarım Deseni
Bunlar da hoşunuza gidebilir...