程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .Net設計模式實例之訪問者模式(Visitor Pattern)

.Net設計模式實例之訪問者模式(Visitor Pattern)

編輯:關於.NET

一、訪問者模式簡介(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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved