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ı:




1 yorum :