Bilgisayar ve bilgisayar parçaları satışı yapan bir mağazanın, bilgisayar toplama sürecini Composite pattern ile simüle edelim. Her bir bilgisayar parçasının fiyatını görebilelim ve bilgisayar toplandığı taktirde toplam maliyeti de elde edebilelim.
ÇÖZÜM
Adım 1(Component Soyut Sınıfının Tasarlanması)
Herşeyden önce bilgisayardaki tüm parçaları temsil edecek olan Component arayüzünü tasarlayarak başlayalım.
Çoğu bilgisayar parçası tek başına kullanılmaktadır. Dolayısıyla aşağıdaki Component ilkel yani Leaf olarak nitelendirebileceğimiz bilgisayar parçarını temsil edecektir.
//Component
abstract class Part
{
protected string _brand;
protected double _price;
protected Part(string brand, double price)
{
_brand = brand;
_price = price;
}
public virtual double GetPrice()
=> _price;
public string GetBrand()
=> _brand;
}
Kimi parçalarda birden fazla parçanın takılmasıyla meydana gelir. Genel anlamda bu parçadan ziyade bilgisayarın ta kendisidir de diyebiliriz. Haliyle şimdide de Composite nitelikteki parçaları ya da bilgisayarı temsil edecek olan Component‘i tasarlayalım.
//Component
abstract class PartComposite : Part
{
protected List<Part> _parts = new();
protected PartComposite(string brand, double price) : base(brand, price)
{
}
public void AddPart(Part part)
=> _parts.Add(part);
public void RemovePart(Part part)
=> _parts.Add(part);
public override double GetPrice()
{
double totalPrice = _price;
Console.WriteLine($"{_brand} \t\t: {_price}");
foreach (Part part in _parts)
{
Console.WriteLine($"\t{part.GetBrand()} \t: {part.GetPrice()}");
totalPrice += part.GetPrice();
}
return totalPrice;
}
}
Yukarıdaki kod bloğunu incelerseniz eğer ‘Part’ sınıfında virtual olarak ayarlanmış olan ‘GetPrice’ metodu ‘PartComposite’ sınıfında override edilerek içerisinde tüm Composite nesneler için hali hazırda toplam maliyet hesaplaması yapılmaktadır. Bu işlemi tek tek Composite nesnelerde de yapabilirdik lakin tek elden burada yapmak hem daha az maliyetli hem de ekstralara ihtiyaç olmadığı için daha doğru olacaktır.
Adım 2(Composite Sınıfının Tasarlanması)
Ben senaryo gereği tüm parçaların birleştirilmiş hali bilgisayar olarak düşündüğümden dolayı Composite nesne olarak da bilgisayarı temsil edeceğim. Buradaki tercih sizlere kalmış. Farklı parçaları da Composite olarak temsil edebilir ve tasarlayabilirsiniz.
//Composite
class Computer : PartComposite
{
public Computer(string brand, double price) : base(brand, price)
{
}
}
Composite sınıfımızın görüldüğü üzere yukarıdaki gibi ‘PartComposite’den kalıtım alacak şekilde tasarlanması yeterlidir. Nihayetinde alt parçaları barındıran koleksiyon dahil gerekli tüm fonksiyonlar base class’tan geliyor olacaktır.
Adım 3(Leaf Sınıfının Tasarlanması)
Şimdi sıra Leaf sınıflarımızı tasarlamaya gelmiş bulunmaktadır. Sınıflarımızı diyorum çünkü birden fazla bilgisayar parçası mevcuttur. Dolayısıyla tüm parçalara karşılık bir nesne tasarımı gerçekleştireceğiz.(Tabi burada tek bir nesne üzerinden de her bir Leaf‘i instance olarak temsil edebilirdik. Haliyle böyle bir yaklaşımın kararı sizinle ihtiyaçlarınıza kalmıştır)
//Leaf
class Monitor : Part
{
public Monitor(string brand, double price) : base(brand, price)
{
}
}
//Leaf
class Keyboard : Part
{
public Keyboard(string brand, double price) : base(brand, price)
{
}
}
//Leaf
class Ram : Part
{
public Ram(string brand, double price) : base(brand, price)
{
}
}
//Leaf
class Mouse : Part
{
public Mouse(string brand, double price) : base(brand, price)
{
}
}
Adım 4(Test)
Haliyle sıra son olarak yapılan bu tasarımı test etmeye gelmiştir.
Bir insanın yardım etme hissiyatı, diğerinin acizliği ya da ezikliğinden değildir. Bilakis onu kendinden çok insan sıfatıyla görmesindendir. Çünkü, insana hizmet etmek insana yakışır.
Bu alanda veya başka bir alanda, benim ve diğer yardımcı insanların paylaşımlarına lütfen acizliğiniz ve ezikliğinizle yaklaşmayınız. İzin istemek, benim hükmüm altına girmeniz anlamına gelmemektedir.