C#'ta Visitor Design Pattern

C#'ta Visitor Design Pattern Kullanımı

Visitor, Behavioral Patterns gurubu içerisinde yer alır.

Visitor tasarım şablonu, bir sınıf hiyerarşisinde yeralan sınıflar üzerinde değişiklik yapmadan, bu sınıflara yeni metodların eklenmesini kolaylaştırır.İstenilen metod bir visitor sınıfında

implemente edilir. Bileşik bir yapı üzerine yeni işlemler eklenmesine olanak sağlar. Ziyaretçi nesne bileşik yapı içindeki nesneleri tek tek ziyaret ederek gerekli bilgileri toplayıp işleyerek kullanıcıya sunar.

using System;

using System.Collections.Generic;


namespace ConsoleApplication1

{

// Client class MainApp

{

static void Main()

{

ObjectStructure o = new ObjectStructure(); o.Attach(new ConcreteElementA()); o.Attach(new ConcreteElementB());

ConcreteVisitor1 v1 = new ConcreteVisitor1(); ConcreteVisitor2 v2 = new ConcreteVisitor2();


o.Accept(v1);

o.Accept(v2);


Console.ReadKey();

}

}


// Visitor

abstract class Visitor

{

public abstract void VisitConcreteElementA( ConcreteElementA concreteElementA);

public abstract void VisitConcreteElementB( ConcreteElementB concreteElementB);

}


// ConcreteVisitor

class ConcreteVisitor1 : Visitor

{

public override void VisitConcreteElementA( ConcreteElementA concreteElementA)

{

Console.WriteLine("{0} visited by {1}", concreteElementA.GetType().Name, this.GetType().Name);

}


public override void VisitConcreteElementB( ConcreteElementB concreteElementB)

{

Console.WriteLine("{0} visited by {1}", concreteElementB.GetType().Name, this.GetType().Name);

}

}


// ConcreteVisitor

class ConcreteVisitor2 : Visitor

{

public override void VisitConcreteElementA( ConcreteElementA concreteElementA)

{

Console.WriteLine("{0} visited by {1}", concreteElementA.GetType().Name, this.GetType().Name);

}


public override void VisitConcreteElementB( ConcreteElementB concreteElementB)

{

Console.WriteLine("{0} visited by {1}", concreteElementB.GetType().Name, this.GetType().Name);

}

}


// Element

abstract class Element

{

public abstract void Accept(Visitor visitor);

}

// ConcreteElement

class ConcreteElementA : Element

{

public override void Accept(Visitor visitor)

{

visitor.VisitConcreteElementA(this);

}


public void OperationA()

{

}

}


// ConcreteElement

class ConcreteElementB : Element

{

public override void Accept(Visitor visitor)

{

visitor.VisitConcreteElementB(this);

}


public void OperationB()

{

}

}


// ObjectStructure class ObjectStructure

{

private List<Element> _elements = new List<Element>();


public void Attach(Element element)

{

_elements.Add(element);

}


public void Detach(Element element)

{

_elements.Remove(element);

}


public void Accept(Visitor visitor)

{

foreach (Element element in _elements)

{

element.Accept(visitor);

}

}

}

}

 

Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git