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

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

SENARYO 6
Bir cümle, kelimelerden; kelime ise harflerden meydana gelmektedir. Haliyle böyle bir metinsel düzeni Composite pattern ile gerçekleştirelim.
ÇÖZÜM
  • Adım 1 (Component Soyut Sınıfının Tasarlanması)
    Bir metni ifade edecek olan; cümle, kelime ve harf diziliminin ortak yapılanması olan Component arayüzü aşağıdaki gibi olacaktır.

        //Component
        abstract class Text
        {
            public abstract void PrintThisBefore();
            public abstract void PrintThisAfter();
            public virtual void Print()
            {
                PrintThisBefore();
                PrintThisAfter();
            }
        }
    

    Burada dikkat ederseniz ‘PrintThisBefore’ ve ‘PrintThisAfter’ metotları mevcuttur. Bu metotlar ile ilgili söz öğesinin öncesi ve sonrası durumlarına göre Composite ve Leaf sınıflarında gerekli işaretlemelerde bulunuyor olacağız. Misal olarak; kelimelerden önce boşluğun gelmesi ya da cümlelerin sonunda nokta gelmesi gibi…

        //Component
        abstract class TextComposite : Text
        {
            protected List<Text> _texts = new();
            public void AddText(Text text)
                => _texts.Add(text);
            public void RemoveText(Text text)
                => _texts.Remove(text);
            public override void Print()
            {
                PrintThisBefore();
                foreach (Text text in _texts)
                    text.Print();
                PrintThisAfter();
            }
        }
    
  • Adım 2 (Composite Sınıfının Tasarlanması)
    Bir metin yapılanmasında kelimeler ve cümleler olmak üzere iki adet Composite sınıf bulunmaktadır. Şimdi gelin bu iki sınıfı sırasıyla tasarlayalım;

        //Composite
        class Word : TextComposite
        {
            public override void PrintThisBefore()
                => Console.Write(" ");
            public override void PrintThisAfter() { /* Boş */ }
        }
    

    ‘Word’ sınıfına göz atarsanız eğer ‘PrintThisBefore’ metodunda her kelimeden önce gelecek olan boşluk karakteri yazdırılmaktadır. ‘PrintThisAfter’ metodunda ise, her kelimeden sonra boşluk ya da nokta gelebilme ihtimali olduğu için herhangi bir işlem gerçekleştirilmemektedir.

        //Composite
        class Sentence : TextComposite
        {
            public override void PrintThisBefore() { /* Boş */ }
            public override void PrintThisAfter()
                => Console.Write(".");
        }
    

    Benzer mantıkla yukarıdaki ‘Sentence’ sınıfında ise ‘PrinThisBefore’ metodu boş geçilmiş lakin ‘PrinThisAfter’ metodunda ise her cümle sonunda nokta geleceği ifade edilmiştir.

  • Adım 3 (Leaf Sınıfının Tasarlanması)
    Metin dizelerinde Leaf olarak tasarlanabilecek tek yapı harflerdir. Haliyle hemen ilgili sınıf tasarımını gerçekleştirelim;

        //Leaf
        class Letter : Text
        {
            char _character;
    
            public Letter(char character)
            {
                _character = character;
            }
            public override void PrintThisBefore()
                => Console.Write(_character);
            public override void PrintThisAfter() { /* Boş */ }
        }
    

    ‘Letter’ sınıfına göz atarsanız eğer bir ‘char’ türünden karakter almakta ve ‘PrinThisBefore’ metodunda bu karakteri ekrana yazdırmaktadır.

  • Adım 4 (Test)
    Yapılan bu inşayı aşağıdaki örnek çalışmayla test edersek eğer;

            static void Main(string[] args)
            {
                Word word1 = new();
                word1.AddText(new Letter('M'));
                word1.AddText(new Letter('e'));
                word1.AddText(new Letter('r'));
                word1.AddText(new Letter('h'));
                word1.AddText(new Letter('a'));
                word1.AddText(new Letter('b'));
                word1.AddText(new Letter('a'));
    
                Word word2 = new();
                word2.AddText(new Letter('D'));
                word2.AddText(new Letter('ü'));
                word2.AddText(new Letter('n'));
                word2.AddText(new Letter('y'));
                word2.AddText(new Letter('a'));
    
                Sentence sentence = new();
                sentence.AddText(word1);
                sentence.AddText(word2);
    
                sentence.Print();
            }
    

    C# Composite Design Pattern(Composite Tasarım Deseni)ekran çıktısını alacağız.

    Haliyle görüldüğü üzere Composite pattern mantığıyla harflerden kelimeler, kelimelerden de cümleler oluşturmuş bulunmaktayız 🙂

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

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