Visitor Pattern in C#
  1. Anasayfa
  2. C#

Visitor Pattern in C#

3

Bu makalemde sizlere visitor pattern nedir, kullanım amacı nedir ve nasıl implemente edilir gibi soruların yanıtlarını aktarmaya çalışacağım. Bunun için bir senaryo üzerinde sorunumuzu tanımlayıp cevap arayalım.

Diyelim ki bir membership yapısı kurdunuz ve bu yapıyı koruyarak yeni metodlar ekleyip membership class’ınıza ait özellikleri de kullanarak methodunuzu esnek bir şekilde geliştirebilmek istiyoruz. Bunun için öncelikle membership class’ımızı ziyaret edecek soyut bir yapı tasarlamamız gerekmektedir.

public interface IMembershipVisitor
{
    void Visit(IMembership membershipManager);
}

Burada visitor interface’ini tanımladık. Buradaki Visit methodu içine verilen bir IMembershipManager tipindeki class’ın tüm özelliklerini kullanarak istediğimiz işi gerçekleştirebilmektedir. Şimdi asıl Membership yapımızı kuralım.

public interface IMembership
{
    Task Signup();

    void Accept(IMembershipVisitor visitor); // burada dışarıdan visitor class ımızı kabul edecek methodumuzu tanımadık
}

Şimdi membership yapımızın concrete class ını yaratalım.

public class Membership : IMembership
{
    Task Signup()
    {
        // not implemented
    }

    void Accept(IMembershipVisitor visitor)
    {
        visitor.Visit(this); dışarıdan parametre olarak verilecek olan visitor class ına ait Visit methoduyla Membership class'ımızın referansını veriyoruz.
    }
}

Yukarıdaki Accept methodumuz IMembershipVisitor interface’inden türetilen herhangi bir class’ı parametre olarak alıp Visit methodunu çalıştıracaktır.

Böylece class dışından türetilen farklı methodları Membership class’ımıza dahil bir şekilde çalıştırabileceğiz ve ana yapıyı da bozmayacağız.

Şimdi örnek bir Visitor class geliştirelim.

public class ForgetPasswordVisitor : IMembershipVisitor
{
    Visit(IMembership membership)
    {
        User user = membership.GetCurrentUser();
        this.SendMail(user.Email); // mail service implementasyonu yaptığımızı varsayıyoruz.
    }
}

// Şimdi bu yapımızın nasıl kullanılacağını görelim.

IMembership membership = ServiceProviderHelper.GetService<IMembership>(); burada ServiceLocater pattern kullanılarak register edilen IMembership tipindeki Membership class ı getirilir.

// Bu yapıya sahip olmayanlar için;

IMembership membership = new Membership(); şeklinde de objemizi oluşturabiliriz.

IMembershipVisitor forgetPasswordVisitor = new ForgetPasswordVisitor();


Şimdi sonradan tasarladığımız ForgetPasswordVisitor class’ını içerisindeki Visit methodunun işlevini Membership class’ımızın işlevlerine uygun bir şekilde çalıştırabilmek için Membership class’ımızın Accept methoduna veriyoruz.

membership.Accept(forgetPasswordVisitor);

Bu şekilde IMembershipVisitor den türettiğimiz her yeni class’ı artık Accept methodu aracılığıyla yeni özellik olarak membership class’ımıza verebileceğiz.

Hoşçakalın.

Bu İçeriğe Tepkin Ne Oldu?
  • 25
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 1
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Fatih Mert, lisans eğitimini Sakarya Üniversite Bilgisayar Mühendisliği’nde tamamlamıştır. Şu anda Bahçeşehir Üniversitesi’nde Yapay Zeka yüksek lisansı okumaktadır. İş hayatında üniversitenin ilk yıllarında .Net ve Sql Server gibi Microsoft teknolojileri ile başlamış ve sonrasında Xamarin, Azure, Angular ve Flutter gibi teknoljilerle de ilgilenip çeşitli yazılımlar üretmiştir. Arçelik, Doğuş Yayın Grubu, Aygaz, Doğan Medya gibi sektörün önde gelen firmalarında C#, .Net, Sql Server, Xamarin ürünleri ile çalışmış, Design Patterns ve Enterprise Architecture konularıyla uzun süredir uğraşmaktadır. Şu anda Xinerji Software firmasında Yazılım Mimarı ve Ekip Lideri olarak çalışmaktadır.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

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

Yorumlar (3)

  1. 04/03/2021

    Son yazılımcı yurt dışından kabul aldığında,
    son takım lideri business class’tan yer ayırttığında,
    malûm kesim spaghetti kodun yenmeyen bişey olduğunu anlayacak!

    Ellerine sağlık Fatih kardeş :)

  2. Hocam emeğinize sağlık. Yazılarınızın devamını bekliyoruz.

  3. 16/03/2021

    Emeğinize, elinize sağlık, güzel bir yazı olmuş .👏🏼

Bir yanıt yazın

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