Programlamada Tasarım Desenleri #21 — Visitor Design Pattern (dotnet c#)

Programlamada Tasarım Desenleri #21 — Visitor Design Pattern (C# .NET ile Örnekli)

Kategoriler: Yazılım Geliştirme, C#, Design Patterns, .NET Core

Etiketler: Visitor pattern nedir, visitor design pattern, c# design patterns, tasarım desenleri, .NET design pattern, davranışsal desenler


Giriş

Merhaba yazılım severler! 👨‍💻👩‍💻 Bu yazımızda, nesne yönelimli programlamada oldukça önemli bir davranışsal tasarım deseni olan Visitor Design Pattern (Ziyaretçi Tasarım Deseni) konusunu ele alacağız. Daha önce serimizin diğer bölümlerinde Singleton, Factory, Strategy gibi desenleri işlemiştik. Şimdi ise olaylara biraz daha soyut taraftan bakalım ve “veren nesneye dokunmadan, onun üzerinde yeni işlemleri nasıl tanımlarız?” sorusuna Visitor Pattern ile cevap arayalım.

Yazının Kapsamı

  • Visitor Design Pattern nedir?
  • Ne zaman ve neden kullanılır?
  • C# (.NET Core) ile gerçek hayatlı bir örnek
  • Artıları ve Eksileri
  • SEO Uyumlu ipuçları

Visitor Design Pattern Nedir?

Visitor Pattern, davranışsal (behavioral) tasarım desenlerinden biridir. Nesnelere yeni işlevler eklemenin alternatif bir yolu olarak karşımıza çıkar. Esas amaç, nesne yapısını bozmadan o nesneler üzerinde yeni operasyonlar tanımlayabilmektir.

Basitçe Söylemek Gerekirse:

Eğer bir nesne ailesine ait elemanlara, o sınıfların implementasyonunu değiştirmeden yeni fonksiyonellik eklemek istiyorsanız, Visitor Pattern sizin için doğru seçimdir.


Ne Zaman Kullanmalıyız?

Visitor Design Pattern aşağıdaki durumlarda oldukça uygundur:

  • ✅ Nesne yapıları sık değişmiyor ama üzerilerine ek işlem (operasyon) yapılması sıklaşıyorsa,
  • ✅ Her nesneye ait yapının farklı bir işleyişe sahip olması gerekiyorsa,
  • ✅ Açık-Kapalı Prensibi’ne (Open/Closed Principle) uygun olarak yeni davranış eklenmek isteniyorsa.

UML Diyagramı

Visitor deseninin temel bileşenleri aşağıdaki gibidir:

  • 📌 Element (örn. Shape, DocumentElement)
  • 📌 ConcreteElement (örn. Circle, Paragraph)
  • 📌 Visitor (örn. IDocumentVisitor)
  • 📌 ConcreteVisitor (örn. HtmlExporter, PdfExporter)

Aşağıdaki basitleştirilmiş UML şeması Visitor Deseni’nin yapısını göstermektedir:

Visitor Pattern UML

Kaynak: refactoring.guru


C# ile Visitor Design Pattern Örneği

Gerçek hayattan bir örnek ile konuyu pekiştirelim. Diyelim ki farklı şekilleri (Kare, Daire) işleyen bir grafik uygulamamız var ve bu şekilleri XML veya JSON formatlarına export etmek istiyoruz.

Adım 1: Element Arayüzü Tanımlayın

public interface IShape
{
    void Accept(IShapeVisitor visitor);
}

Adım 2: Concrete Element Sınıfları Oluşturun

public class Circle : IShape
{
    public int Radius { get; set; }

    public void Accept(IShapeVisitor visitor)
    {
        visitor.VisitCircle(this);
    }
}

public class Square : IShape
{
    public int SideLength { get; set; }

    public void Accept(IShapeVisitor visitor)
    {
        visitor.VisitSquare(this);
    }
}

Adım 3: Visitor Arayüzü

public interface IShapeVisitor
{
    void VisitCircle(Circle circle);
    void VisitSquare(Square square);
}

Adım 4: Concrete Visitor (Örneğin JSON Export)

public class JsonExportVisitor : IShapeVisitor
{
    public void VisitCircle(Circle circle)
    {
        Console.WriteLine($"{{ \"type\": \"circle\", \"radius\": {circle.Radius} }}");
    }

    public void VisitSquare(Square square)
    {
        Console.WriteLine($"{{ \"type\": \"square\", \"sideLength\": {square.SideLength} }}");
    }
}

Adım 5: Kullanım

var shapes = new List
{
    new Circle { Radius = 5 },
    new Square { SideLength = 10 }
};

var visitor = new JsonExportVisitor();

foreach (var shape in shapes)
{
    shape.Accept(visitor);
}

Sonuç:

{ "type": "circle", "radius": 5 }
{ "type": "square", "sideLength": 10 }

Visitor Pattern’ın Avantajları ✅

  • ✅ Yeni işlemler eklemek çok kolaydır.
  • ✅ Kodunuzu Açık / Kapalı Prensibi’ne göre yapılandırır.
  • ✅ Tip güvenliği korunur – her sınıf kendi işlemini sağlar.
  • ✅ Tek sorumluluk prensibini destekler.

Dezavantajları ❌

  • ❌ Nesne yapısında yapılacak değişikliklerde tüm Visitor sınıfları revize edilmelidir.
  • ❌ Kod okunabilirliğini düşürebilir, özellikle büyük projelerde.
  • ❌ Çok sayıda öğe sınıfı olduğunda Visitor sınıfları karmaşıklaşabilir.

Gerçek Hayat Uygulamalarında Kullanım Alanları

  • 🧾 Fatura sistemlerinde farklı raporlar üretme
  • 📄 Doküman yönetim sistemlerinde farklı formatlarda çıktı alma (PDF, Word, HTML)
  • 🎮 Oyun geliştirmede oyun karakterlerini işleyen kullanıcı davranışları
  • 🧠 Kompozit veya ağaca benzer yapılarda gezinme (Composite Pattern ile birlikte harika çalışır!)

SEO İçin İpuçları

WordPress blogunuzu ziyaretçiler için cazip kılmak adına aşağıdaki SEO stratejilerini uygulamayı unutmayın:

  • Başlıkta anahtar kelimelere yer verin: “Visitor Design Pattern”, “C# .NET”, “Tasarım Deseni”
  • ,

    başlıklarıyla yapıyı düzenleyin

  • Kod örneklerini
     formatında girerek okunabilirliği artırın
  • Görsel kullanımı yapın (UML diyagram + sonucu gösteren çıktılar)
  • Meta açıklama (meta description) ekleyin:
    “Visitor Design Pattern nedir? C# (dotnet core) ile gerçek örnekle anlatıyoruz. UML diyagramı, avantajları, kod örneği ve kullanım alanlarıyla kapsamlı rehber.”

Sonuç

Visitor Design Pattern, bir nesne yapısına dokunmadan yeni işlemler tanımlamanın en zarif yollarından biridir. Bu desen, büyüyen yazılım mimarilerinde size büyük bir esneklik sunar. Elbette, ne zaman ve nerede kullanacağınızı iyi analiz etmek gerekir.


Kaynaklar 📚


Bonus 🎁

GITHUB REPO İNDİR — Visitor Design Pattern C# Örneği


Yorumlar kısmında Visitor Pattern hakkında aklınıza takılanları bizimle paylaşmayı unutmayın. Bir sonraki desende görüşmek üzere! 🚀


Yazılım sizinle olsun! 👨‍💻👩‍💻


Visitor Pattern Abstract
Code Snippet Visitor Pattern
Visitor Pattern Infographic
Presentation Visitor Pattern

You may also like...

Bir yanıt yazın

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