首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 設計模式實戰:訪問者模式完整解析與雙重分派機制

     編輯:關於.NET

模式簡介

訪問者模式表示作用於物件結構中各元素的操作,讓您在不變更元素類別的前提下定義新操作,將資料結構與操作解耦。優點:新增操作容易(只需新增 Visitor),相關行為集中在訪問者物件中。

適用場景

資料結構穩定、演算法易變時適用;若資料結構頻繁變動則不適合。

結構角色

  • Visitor:抽象訪問者,為每個 ConcreteElement 宣告 Visit
  • ConcreteVisitor1/2:具體訪問者,實作各 Visit 方法
  • ObjectStructure:物件結構,管理元素集合,提供 Accept(Visitor) 遍歷
  • Element:抽象元素,宣告 Accept(Visitor)
  • ConcreteElementA/B:具體元素,Accept 呼叫 visitor.VisitConcreteElementX(this)
訪問者模式結構圖

程式碼實作

// Visitor
public abstract class Visitor {
    public abstract void VisitConcreteElementA(ConcreteElementA e);
    public abstract void VisitConcreteElementB(ConcreteElementB e);
}
public class ConcreteVisitor1 : Visitor {
    public override void VisitConcreteElementA(ConcreteElementA e) => Console.WriteLine($"{GetType().Name} 訪問 {e.GetType().Name}");
    public override void VisitConcreteElementB(ConcreteElementB e) => Console.WriteLine($"{GetType().Name} 訪問 {e.GetType().Name}");
}
public class ConcreteVisitor2 : Visitor {
    public override void VisitConcreteElementA(ConcreteElementA e) => Console.WriteLine($"{GetType().Name} 訪問 {e.GetType().Name}");
    public override void VisitConcreteElementB(ConcreteElementB e) => Console.WriteLine($"{GetType().Name} 訪問 {e.GetType().Name}");
}

// Element
public abstract class Element { public abstract void Accept(Visitor v); }
public class ConcreteElementA : Element {
    public override void Accept(Visitor v) => v.VisitConcreteElementA(this);
    public void OperationA() { }
}
public class ConcreteElementB : Element {
    public override void Accept(Visitor v) => v.VisitConcreteElementB(this);
    public void OperationB() { }
}

// ObjectStructure
public class ObjectStructure {
    List<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 v) => elements.ForEach(e => e.Accept(v));
}

// Client
static void Main() {
    var os = new ObjectStructure();
    os.Add(new ConcreteElementA()); os.Add(new ConcreteElementB());
    os.Accept(new ConcreteVisitor1()); os.Accept(new ConcreteVisitor2());
}
訪問者模式執行結果

核心機制:雙重分派

element.Accept(visitor) → visitor.VisitConcreteElement(element),透過方法多載解析在編譯期確定具體元素類型,在執行期確定具體訪問者類型,實現雙重分派。

總結

訪問者模式將演算法從資料結構分離,適合「資料結構固定、操作多變」場景(如編譯器 AST 遍歷、報表匯出、XML 處理),是實現開放封閉原則的有力工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved