表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
無考慮乙個編譯器,他將源程式表示為乙個抽象語法樹。該編譯器需要在抽象語法上實施某些操作以進行「靜態語義」分析,例如檢查是否所有的變數都已經被定義了。他也需要生成**。因為它可能要定義許多操作以進行**檢查、**優化、流程分析、檢查變數是否在使用前被賦初值,等等。此外,還可使用抽象語法樹進行優美格式列印、程式重構、code instrumentation以及物件進行多種度量。
以下情況使用visitor模式:
訪問者模式把資料結構和作用於結構上的操作解耦合,使得操作集合可相對自由地演化。訪問者模式適用於資料結構相對穩定演算法又易變化的系統。因為訪問者模式使得演算法操作增加變得容易。若系統資料結構物件易於變化,經常有新的資料物件增加進來,則不適合使用訪問者模式。訪問者模式的優點是增加操作很容易,因為增加操作意味著增加新的訪問者。訪問者模式將有關行為集中到乙個訪問者物件中,其改變不影響系統資料結構。其缺點就是增加新的資料結構很困難。—— from 百科
簡單來說,訪問者模式就是一種分離物件資料結構與行為的方法,通過這種分離,可達到為乙個被訪問者動態新增新的操作而無需做其它的修改的效果。簡單關係圖:
來看看原碼:乙個visitor類,存放要訪問的物件,
實現**:
狀態結構:
public
inte***ce
visitor
public
class
myvisitor
implements
visitor
}
subject類,accept方法,接受將要訪問它的物件,getsubject()獲取將要被訪問的屬性:
public
inte***ce
subject
public
class
mysubject
implements
subject
@override
public string getsubject()
}
測試類:
public
class test
}
輸出:visit the subject:love
該模式適用場景:如果我們想為乙個現有的類增加新功能,不得不考慮幾個事情:1、新功能會不會與現有功能出現相容性問題?2、以後會不會再需要新增?3、如果類不允許修改**怎麼辦?面對這些問題,最好的解決方法就是使用訪問者模式,訪問者模式適用於資料結構相對穩定的系統,把資料結構和演算法解耦,
引用:
Behavioral模式之Iterator模式
提供一種方法順序訪問乙個集合物件中各個元素,而不需要暴露該物件的內部表示。cursor 游標 乙個聚合物件,如列表 list 應該提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內部結構。資料庫中最常用的iterator模式。以下情況使用iterator模式 顧名思義,迭代器模式就是順序訪問...
Behavioral模式之State模式
允許乙個物件再其內部狀態改變時,改變它的行為。物件看起來似乎修改了它的類。狀態物件 objects for states 考慮乙個表示網路連線的類tcpconnection。乙個tcpconnection物件的狀態處於若干不同狀態之一 連線已建立 established 正在監聽 listenlin...
vi的工作模式
第一 命令列模式 該模式是進入vi編輯器後的預設模式。任何時候,不管使用者處於何種模式,按下esc鍵即可進入命令模式。在該模式下,使用者可以輸入vi命令,使用者管理自己的文件。此時從鍵盤上輸入的任何字元都被當作編輯命令來解釋。若輸入的字元是合法的vi命令,則vi在接受使用者命令之後完成相應的動作。但...