Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# Composite Design Pattern(Composite Tasarım Deseni)

SENARYO 4
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.

            static void Main(string[] args)
            {
                Computer computer = new("Asus", 10000);
                computer.AddPart(new Monitor("Asus", 2750));
                computer.AddPart(new Keyboard("A4Tech", 750));
                computer.AddPart(new Ram("XXX", 1750));
                computer.AddPart(new Mouse("Hp", 125));
    
                double totalPrice = computer.GetPrice();
                Console.WriteLine($"Toplam Fiyat \t: {totalPrice}");
            }
    

    Yukarıdaki kod bloğunu derleyip, çalıştırdığımızda aşağıdaki ekran görüntüsüyle karşılaşacağız.
    C# Composite Design Pattern(Composite Tasarım Deseni)İşte bu kadar 🙂

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir