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

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

SENARYO 3
Bir uygulamadaki hiyerarşik menülerin Composite pattern ile tasarımını gerçekleştirelim.
ÇÖZÜM
  • Adım 1 (Component Soyut Sınıfının Tasarlanması)
    Bir menü, tek seviyelik bir menü olabileceği gibi(Leaf), altında birden fazla farklı menü barındıran karmaşık(Composite) bir menüde olabilir. Haliyle her iki türlüde ilgili menülerin ortak alanlarını barındıracak olan Component arayüzünü tasarlayalım.

        //Component
        abstract class Menu
        {
            protected string _name;
            protected string _description;
            protected Menu(string name, string description)
            {
                _name = name;
                _description = description;
            }
            public string GetName()
                => _name;
            public string GetDescription()
                => _description;
            public abstract void Print(int level = 0);
        }
    
        //Component
        abstract class MenuComposite : Menu
        {
            protected List<Menu> _menus = new();
            public MenuComposite(string name, string description) : base(name, description)
            {
            }
            public void AddMenu(Menu menu)
                => _menus.Add(menu);
            public void RemoveMenu(Menu menu)
                => _menus.Remove(menu);
        }
    

    Yukarıdaki ‘Menu’ Component arayüzündeki ‘Print’ fonksiyonuna göz atarsanız eğer int türünden ‘level’ isminde bir parametre almaktadır. Bunun sebebi, ilgili menüleri listelerken derecelerine göre içe kıvrımlı bir şekilde görsellik oluşturabilmek içindir.

  • Adım 2 (Composite Sınıfının Tasarlanması)
    Ardından sırada Leaf ve Composite nesneleri oluşturmak vardır. Siz istediğinizden başlayabilirsiniz. Ben deniz Composite nesneyi tasarlayarak devam ediyorum.

        //Composite
        class MenuItems : MenuComposite
        {
            public MenuItems(string name, string description) : base(name, description)
            {
            }
    
            public override void Print(int level = 0)
            {
                Console.WriteLine($"{(level == 0 ? "" : "\t".PadRight(level, '\t'))}{GetName()} {{{GetDescription()}}}");
                foreach (Menu menu in _menus)
                    menu.Print(menu is MenuComposite ? level + 1 : level + 2);
            }
        }
    
  • Adım 3 (Leaf Sınıfının Tasarlanması)
    Benzer şekilde Leaf nesnesini de tasarlarsak eğer;

        class MenuItem : Menu
        {
            public MenuItem(string name, string description) : base(name, description)
            {
            }
    
            public override void Print(int level = 0)
                => Console.WriteLine($"{"\t".PadRight(level, '\t')}{GetName()} {{{GetDescription()}}}");
        }
    
  • Adım 4 (Test)
    Evet, görüldüğü üzere tasarımsal inşa tamamlanmış bulunmaktadır. Şimdi sıra inşa edilen bu tasarımı test etmeye gelmiştir.

            static void Main(string[] args)
            {
                MenuItems menuItems1 = new("Ana Menü 1", "Bu ana menü 1'dir...");
                menuItems1.AddMenu(new MenuItem("Menü 1", "Bu alt menü 1'dir..."));
                menuItems1.AddMenu(new MenuItem("Menü 2", "Bu alt menü 2'dir..."));
                menuItems1.AddMenu(new MenuItem("Menü 3", "Bu alt menü 3'dir..."));
    
                MenuItems menuItems2 = new("Ana Menü 2", "Bu ana menü 2'dir...");
                menuItems2.AddMenu(new MenuItem("Menü 4", "Bu alt menü 4'dür..."));
    
                MenuItems menuItems3 = new("Ana Menü 3", "Bu ana menü 3'dür...");
                menuItems3.AddMenu(new MenuItem("Menü 5", "Bu alt menü 5'dir..."));
                menuItems3.AddMenu(new MenuItem("Menü 6", "Bu alt menü 6'dir..."));
                menuItems3.AddMenu(new MenuItem("Menü 7", "Bu alt menü 7'dir..."));
    
                menuItems1.AddMenu(menuItems2);
                menuItems1.AddMenu(menuItems3);
    
                menuItems2.AddMenu(new MenuItem("Menü 8", "Bu alt menü 8'dir..."));
    
                MenuItems menuItems4 = new("Ana Menü 4", "Bu ana menü 4'dür...");
                menuItems4.AddMenu(new MenuItem("Menü 9", "Bu alt menü 9'dur..."));
                menuItems4.AddMenu(new MenuItem("Menü 10", "Bu alt menü 10'dur..."));
                menuItems4.AddMenu(new MenuItem("Menü 11", "Bu alt menü 11'dur..."));
    
                MenuItems menuItems5 = new("Ana Menü 5", "Bu ana menü 5'dir...");
                menuItems5.AddMenu(new MenuItem("Menü 12", "Bu alt menü 12'dir..."));
                menuItems5.AddMenu(new MenuItem("Menü 13", "Bu alt menü 13'dir..."));
                menuItems5.AddMenu(new MenuItem("Menü 14", "Bu alt menü 14'dir..."));
    
                menuItems4.AddMenu(menuItems5);
                menuItems3.AddMenu(menuItems4);
    
                menuItems1.Print();
            }
    

    Yukarıdaki dolu dizgin menü verisiyle doldurulmuş örnek kod bloğunu derleyip, çalıştırırsak eğer aşağıdaki gibi bir ekran çıktısıyla karşılacağız.
    C# Composite Design Pattern(Composite Tasarım Deseni)Görüldüğü üzere her menü seviyesine göre içe kıvrımlı bir şekilde menüler ekrana listeletilmiştir.

İyi çalışlar…

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

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