訪問者模式

2021-08-25 16:17:37 字數 1964 閱讀 8393

訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接收這個操作的資料結構則可以保持不變。

訪問者模式的組成結構:

1) 訪問者角色(visitor):為該物件結構中具體元素角色宣告乙個訪問操作介面。該操作介面的名字和引數標識了傳送訪問請求給具體訪問者的具體元素角色。這樣訪問者就可以通過該元素角色的特定介面直接訪問它。

2) 具體訪問者角色(concrete visitor):實現每個由訪問者角色(visitor)宣告的操作。

3) 元素角色(element):定義乙個accept操作,它以乙個訪問者為引數。

4) 具體元素角色(concrete element):實現由元素角色提供的accept操作。

5) 物件結構角色(object structure):這是使用訪問者模式必備的角色。它要具備以下特徵:能列舉它的元素;可以提供乙個高層的介面以允許該訪問者訪問它的元素;可以是乙個復合(組合模式)或是乙個集合,如乙個列表或乙個無序集合。

如何讓訪問者模式跑起來?

首先在原有的類層次結構中新增accept方法,然後將這個類層次中的類放到乙個物件結構中去,這樣再建立訪問者角色...

public inte***ce node
public class nodea implements node 

/*** nodea特有的商業方法,visitor就是對其進行封裝

*/public void operationa()

}

public class nodeb implements node 

/*** nodeb特有的商業方法,visitor就是對其進行封裝

*/public void operationb()

}

public inte***ce visitor
public class visitora implements visitor 

/*** 對應於nodeb的訪問操作

*/public void visitor(nodeb node)

}

public class visitorb implements visitor 

/*** 對應於nodeb的訪問操作

*/public void visitor(nodeb node)

}

/**

* 結構物件

*/public class objectstructure

}/**

* 增加乙個新的元素

*/public void add(node node)

}

public class client 

}

雙重分派

首先在客戶程式中將具體訪問者模式作為引數傳遞給具體元素角色,這便完成了一次分派。

進入具體元素角色後,具體元素角色呼叫作為引數的具體訪問者模式中的visitor方法,同時將自己(this)作為引數傳遞進去。具體訪問者模式再根據引數的不同來選擇方法來執行,這便完成了第二次分派。

《設計模式》一書中給出了訪問者模式適用的情況:

1) 乙個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。

2) 需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作「汙染」這些物件的類。visitor使得你可以將相關的操作集中起來定義在乙個類中。

3) 當該物件結構被很多應用共享時,用visitor模式讓每個應用僅包含需要用到的操作。

4) 定義物件結構的類很少改變,但經常需要在此結構上定義新的操作。改變物件結構類需要重定義對所有訪問者的介面,這可能需要很大的代價。如果物件結構類經常改變,那麼可能還是在這些類中定義這些操作較好。

訪問者模式

訪問者模式 visitor pattern 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。一 問題 集合是大多數的系統都要處理的一種容器物件,它儲存了對其它物件的引用。一般情況下,在集合上採取的...

訪問者模式

行為模式中的訪問者模式 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作,一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。動機 類層次結構中可能經常由於引入新的操作,從而將型別變得脆弱。在軟體構建過程中,由於需求的改變,某些類層次結構中常常需要增...

訪問者模式

1.說明 namespace visitorspattern 象棋類 public abstract class chess public class redchess chess public class blackchess chess 在贏的情況下的狀態 public class win ac...