1. 程式人生 > >21、訪問者模式(Visitor)

21、訪問者模式(Visitor)

訪問者模式把資料結構和作用於結構上的操作解耦合,使得操作集合可相對自由地演化。訪問者模式適用於資料結構相對穩定演算法又易變化的系統。因為訪問者模式使得演算法操作增加變得容易。若系統資料結構物件易於變化,經常有新的資料物件增加進來,則不適合使用訪問者模式。訪問者模式的優點是增加操作很容易,因為增加操作意味著增加新的訪問者。訪問者模式將有關行為集中到一個訪問者物件中,其改變不影響系統資料結構。其缺點就是增加新的資料結構很困難。—— From 百科

簡單來說,訪問者模式就是一種分離物件資料結構與行為的方法,通過這種分離,可達到為一個被訪問者動態新增新的操作而無需做其它的修改的效果。簡單關係圖:

這裡寫圖片描述

來看看原碼:一個Visitor類,存放要訪問的物件,

public interface Visitor {  
    public void visit(Subject sub);  
}  
public class MyVisitor implements Visitor {  

    @Override  
    public void visit(Subject sub) {  
        System.out.println("visit the subject:"+sub.getSubject());  
    }  
}  

Subject類,accept方法,接受將要訪問它的物件,getSubject()獲取將要被訪問的屬性,

public interface Subject {  
    public void accept(Visitor visitor);  
    public String getSubject();  
}  
public class MySubject implements Subject {  

    @Override  
    public void accept(Visitor visitor) {  
        visitor.visit(this);  
    }  

    @Override  
    public String getSubject
() { return "love"; } }

測試:

public class Test {  

    public static void main(String[] args) {  

        Visitor visitor = new MyVisitor();  
        Subject sub = new MySubject();  
        sub.accept(visitor);      
    }  
}  

輸出:

visit the subject:love

該模式適用場景:如果我們想為一個現有的類增加新功能,不得不考慮幾個事情:

  1. 新功能會不會與現有功能出現相容性問題?
  2. 以後會不會再需要新增?
  3. 如果類不允許修改程式碼怎麼辦?

面對這些問題,最好的解決方法就是使用訪問者模式,訪問者模式適用於資料結構相對穩定的系統,把資料結構和演算法解耦,