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

設計模式精講:訪問者模式——分離操作與對象結構的藝術

     編輯:Java 相關知識

訪問者模式封裝作用於數據結構中各元素的操作,使在不修改數據結構前提下定義新操作成為可能。它是行為型模式中最複雜但也最強大的模式之一,核心思想是雙分派。

一、 五大角色與雙分派機制

  • 抽象訪問者:聲明 visit(ConcreteElement) 重載方法,定義可訪問元素類型。
  • 具體訪問者:實現具體操作邏輯,如導出報表、序列化、驗證等。
  • 抽象元素:聲明 accept(Visitor) 方法,規範接受訪問行為。
  • 具體元素:實現 accept 調用 visitor.visit(this),實現雙分派第一步。
  • 對象結構:容納元素集合,提供遍歷入口。

二、 通用代碼實現

interface Visitor {
    void visit(ElementA a);
    void visit(ElementB b);
}

interface Element { void accept(Visitor v); }

class ElementA implements Element {
    public void accept(Visitor v) { v.visit(this); }
    public void doA() { System.out.println("ElementA"); }
}

class ElementB implements Element {
    public void accept(Visitor v) { v.visit(this); }
    public void doB() { System.out.println("ElementB"); }
}

class ConcreteVisitor implements Visitor {
    public void visit(ElementA a) { a.doA(); /* 操作A邏輯 */ }
    public void visit(ElementB b) { b.doB(); /* 操作B邏輯 */ }
}

class ObjectStructure {
    List<Element> elements = new ArrayList<>();
    public void accept(Visitor v) { elements.forEach(e -> e.accept(v)); }
}

三、 優缺點與「致命缺陷」

優點缺點
符合單一職責:操作邏輯集中在訪問者中增加新元素類極難:需修改所有訪問者接口及實現
擴展性好:新增操作只需新增訪問者類破壞封裝:訪問者需訪問元素內部細節
復用性強:多對象共享同一訪問邏輯適用場景窄:元素結構穩定、操作易變時才適合

四、 適用場景與重構策略

  • 對象結構穩定(元素類型固定),但操作頻繁變化/增加(如編譯器 AST 遍歷、文檔導出、權限驗證)。
  • 避免在元素類型頻繁變化的系統中使用。
  • 重構技巧:若元素類較少但操作多,可將訪問者接口改為抽象類,提供默認空實現,減少子類負擔。

五、 總結

GoF 評價:「大多數情況下你不需要訪問者模式,但當你需要時,你真的需要它。」它是針對「操作易變、結構穩定」場景的終極武器,濫用則會帶來維護噩夢。決策前請三思:元素結構是否真正穩定?操作變化是否頻繁?

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