一、訪問者模式簡介(Brief Introduction)
表示一個作用於某對象結構中的元素操作。它使你可以在不改變各元素類的前提下定義 作用於這些元素的新操作,它把數據結構和作用於結構上的操作之間的耦合性解脫開,使的 操作結合可以相對自由地演化。優點是增加新的操作很容易,因為增加一個新的操作就意味 著增加一個新的訪問者,訪問者模式將有關的行為集中到一個訪問對象中。
二、解決的問題(What To Solve)
訪問者模式的目的是要把處理從數據結構分離出來。如果系統有比較穩定的數據結構, 又有易於變化的算法的話,使用訪問者模式是個不錯的選擇,因為訪問者模式使的算法操作 的增加變的容易。相反,如果系統的數據結構不穩定,易於變化,則此系統就不適合使用訪 問者模式了。
三、訪問者模式分析(Analysis)1、訪問者模式結構
Visitor:為對象結構中Element的每一個子類聲明一個Visitor操作。
ConcreteVisitor1、ConcreteVisitor2:具體的訪問者,實現父類Visitor的操作。每個 操作實現算法的一部分,而該算法片段仍是對應與結構中對象的類。
ObjectStructure:枚舉它的元素,可以提供一個高層的接口以允許訪問者訪問它的元素 。
Element:定義一個Accept操作,它以一個訪問者為參數。
ConcreteElementA、ConcreteElementB: 具體元素,實現父類Element的方法Accept。
2、源代碼
1、訪問者抽象類Visitor
public abstract class Visitor
{
public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
}
2、具體訪問者ConcreteVisitor1、ConcreteVisitor2
public class ConcreteVisitor1 : Visitor
{
public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
{
Console.WriteLine("{0}訪問{1}",this.GetType ().Name,concreteElementA.GetType().Name);
}
public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
{
Console.WriteLine("{0}訪問{1}", this.GetType().Name, concreteElementB.GetType().Name);
}
}
public class ConcreteVisitor2 : Visitor
{
public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
{
Console.WriteLine("{0}訪問{1}", this.GetType().Name, concreteElementA.GetType().Name);
}
public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
{
Console.WriteLine("{0}訪問{1}", this.GetType().Name, concreteElementB.GetType().Name);
}
3、定義一個Accept操作,它以一個訪問者為參數
public abstract class Element
{
public abstract void Accept(Visitor visitor);
}
4、具體元素ConcreteElementA、ConcreteElementB
public class ConcreteElementA : Element
{
public override void Accept(Visitor visitor)
{
visitor.VisitConcreteElementA(this);
}
public void OperationA()
{
}
}
public class ConcreteElementB : Element
{
public override void Accept(Visitor visitor)
{
visitor.VisitConcreteElementB(this);
}
public void OperationB()
{
}
}
5、對象結構ObjectStructure
public class ObjectStructure
{
IList<Element> elements=new List<Element>();
public void Add(Element e)
{
elements.Add(e);
}
public void Remove(Element e)
{
elements.Remove(e);
}
public void Accept(Visitor visitor)
{
foreach (Element e in elements)
{
e.Accept(visitor);
}
}
}
5、客戶端代碼
static void Main(string[] args)
{
ObjectStructure os = new ObjectStructure();
os.Add(new ConcreteElementA());
os.Add(new ConcreteElementB());
ConcreteVisitor1 cv1 = new ConcreteVisitor1();
ConcreteVisitor2 cv2 = new ConcreteVisitor2();
os.Accept(cv1);
os.Accept(cv2);
Console.Read();
}
3、程序運行結果
四、總結(Summary)
訪問者模式表示一個作用於某對象結構中的個元素操作。它使你可以在不改變各元素類 的前提下定義作用於這些元素的新操作. 訪問者模式的目的是要把處理從數據結構分離出來
出處:http://www.cnblogs.com/ywqu