Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Template Method Tasarım Deseni - Template Method Design Pattern | Adapter Tasarım Deseni - Adapter Design Pattern>>

Visitor Tasarım Deseni - Visitor Design Pattern

Yazar harunozer 04 December 2012

Visitor Tasarım Deseni - Visitor Design Pattern Visitor tasarım deseni (ziyaretçi tasarım deseni), behavioral grubuna ait inceleyeceğimiz son tasarım desenidir. Uygulamada ki sınıflara yeni metotlar eklenmesini düzenleyen bir tasarım desenidir. Dofactory.com a göre kullanım sıklığı 20% civarındadır.

Uygulamada ki bir yapıda ki bazı sınıflara bir işlevsellik eklenmesi gerektiğinde genelde ya yapıdaki sınıfların uyguladığı arayüzde metot tanımlanır ve bu arayüzü uygulayan sınıflarda metot yazılır veya eklenmesi gereken sınıflara eklenir. Arayüze metot tanımlarsak metodu kullanmayacak olan sınıflarda da bu metot uygulanacağı için tasarım prensiplerinden “Interface Segregation Principle - ISP” a uymamış oluruz. İlgili alt sınıflara ayrı ayrı metot eklersek de ileride bakımı zorlaşacak ve kodun karışmasına neden olacak bir yapı kurmuş oluruz. Böyle durumlarda bu hatalara düşmemek için visitor tasarım deseni kullanılabilir. Visitor tasarım deseninin uml şeması aşağıdadır.

 

Visitor, ConcreteElement sınıflarının yani Element arayüzünü uygulayan sınıfların kullanabileceği metotların tanımlandığı arayüzdür. Şöyle ki burada tanımlanan metotlar parametre olarak ConcreteElement sınılarını alırlar ve bu sınıflar üzerinden işlem yapabilirler. Bu da Element arayüzündeki Accept metodu ile yapılır. Bu metot içinde kendisine gönderilen Visitor arayüzünden türeyen nesnede ki Visit metoduna parametre olarak kendisini vererek yapar. Böylece gönderilen ConcreteVisitor nesnesinde ki ilgili Visit metodu çalıştırılmış olunur.

Sanırım biraz karışık oldu bir örnek yaparak daha visitor tasarım desenini daha iyi anlayalım. Örnek uygulamamızda telefon yapısını ele alalım. Telefon arayüzü ve bu arayüzü uygulayan gerçek telefon nesnelerimiz olsun. Telefon arayüzünde sadece Ara isminde bir metot bulunduğunu düşünelim. Tabi ki bu arayüzü uygulayan bütün sınıflarda da bu metot overwrite edilmiş olacaktır çünkü bütün telefonlar arama yapar. Sonra telefon arayüzünden türeyen bazı nesnelere Sms ve MMS desteği de ekleyelim. Fakat bütün telefon sınıfları bu özellikleri desteklemediği için bazı telefon nesnelerine eklememiz gerekiyor.  Uygulamamızın class diyagramı ve kodları aşağıdadır.

 

//Visitor yapısı
interface ITelVisitor
{
    void Visit(TelModel1 tel);
    void Visit(TelModel2 tel);
}

//ConcreteVisitor yapısı
class MesajModulVisitor : ITelVisitor
{
    public void Visit(TelModel1 tel)
    {
        Console.WriteLine("TelModel1 mesaj gönderebileceğinden mesaj gönderiliyor...");
    }
    public void Visit(TelModel2 tel)
    {
        Console.WriteLine("TelModel2 mesaj gönderme özelliğine sahip değildir...");
    }
}
//ConcreteVisitor yapısı
class MmsModulVisitor : ITelVisitor
{
    public void Visit(TelModel1 tel)
    {
        Console.WriteLine("TelModel1 MMS gönderemez...");
    }
    public void Visit(TelModel2 tel)
    {
        Console.WriteLine("TelModel2 MMS gönderebileceğinden gönderiyor...");
    }
}
//Element
interface ITelefon
{
    void Ara(string No);
    void ModuluYukle(ITelVisitor t);
}
//ConcreteElement
class TelModel1 : ITelefon
{
    public void Ara(string No)
    {
        Console.WriteLine("TelModel1 " + No + " nosunu aranıyor...");
    }

    public void ModuluYukle(ITelVisitor t)
    {
        t.Visit(this);
    }
}
//ConcreteElement
class TelModel2 : ITelefon
{
    public void Ara(string No)
    {
        Console.WriteLine("TelModel2 " + No + " nosunu aranıyor...");
    }
    public void ModuluYukle(ITelVisitor t)
    {
        t.Visit(this);
    }
}

class Program
{
    static void Main(string[] args)
    {
        //İlk başta sadece ITelefon arayüzü ve bunu uygulayan sınıflar var
        //ITelefon arayüzünde ise sadece ara metodu var
        ITelefon Model1 = new TelModel1();
        ITelefon Model2 = new TelModel2();
        Model1.Ara("0212-111-22-33");
        Model2.Ara("0212-444-55-66");
        //Sonra ITelefon arayüzünü uygulayan sınıfların bazılarına yeni özellikler eklemek gerekti.
        //İlk olarak ITelefon arayüzünü uygulayan sınıflara göre Visitor Interface yi tanımlıyoruz.
        //Ardından ekleyeceğimiz her özellik için bu arayüzü uygulayan ConcreteVisitor sınıflarını yazıyoruz.
        //Mesaj Gönderim için MesajModulVisitor sınıfını oluşturuyoruz
        ITelVisitor MesajVisitor = new MesajModulVisitor();
        Model1.ModuluYukle(MesajVisitor);
        Model2.ModuluYukle(MesajVisitor);
        //Ve sonrada MMS gönderimi icat oldu ve MMS için MmsModulVisitor sınıfını oluşturuyoruz.
        ITelVisitor MmsVisitor = new MmsModulVisitor();
        Model1.ModuluYukle(MmsVisitor);
        Model2.ModuluYukle(MmsVisitor);
        Console.ReadKey();
    }
}
 

VisitorSample.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 4  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri