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.