訪問者模式,是封裝一些作用於某種資料結構的各元素操作,它可以在不改變資料結構的前提下,定義作用域這些元素的新的操作。主要將資料結構與資料操作分離,解決資料結構和操作耦合性問題。
訪問者模式的基本工作原理是:在被訪問的類裡面加乙個對外提供接待訪問者的介面。
說明:1)visitor:是抽象訪問者,為該物件結構中的concreteelement的每乙個類宣告乙個visit操作
2)concretevisitor:是乙個具體的訪問者,實現每個有vistor宣告的操作,是每個操作實現的部分
3)objectstructure:能列舉它的元素,可以提供乙個高層的介面,用來允許訪問者訪問元素
4)element:定義乙個accept方法,接收乙個訪問者物件
5)concreteelement:為具體元素,實現了accept方法
將人分為男人和女人,對歌手進行測評。當看完某個歌手表演後,得到他們對該歌手不同的評價(評價有不同的種類,比如成功、失敗等),請使用訪問者模式來實現。
類圖如下所示:
**如下所示:
建立action抽象類及其子類:
public abstract class action
public class success extends action
public void getwomanresult(woman woman)
}
public class fail extends action
public void getwomanresult(woman woman)
}
建立person抽象類及其子類:
public abstract class person
public class man extends person
}
/**
* 這裡我們使用到了雙分派,即首先在客戶端程式中,將具體狀態作為引數傳遞到woman中(第乙個分派)
* 然後woman類呼叫作為引數的具體方法,同時將自己(this)作為引數傳入,完成第二次的分派。
**/public class woman extends person
}
建立objectstructure類:
//資料結構,管理很多人
public class objectstructure
//移除
public void detach(person person)
//顯示測評情況
public void display(action action)}}
建立client類:
public class client
}
所謂雙分派是指:不管類怎麼變化,我們都能找到期望的方法執行。雙分派意味著得到執行的操作取決於請求的種類和兩個接收者的型別。
以上面的例項為例,假設我們需要新增乙個wait的狀態類,考察man類和woman類的反應,由於使用了雙分派,只需增加乙個action子類即可在客戶端呼叫,而不需要改動其他類的**。
優點:1)訪問者模式符合單一職責原則,讓程式具有優秀的擴充套件性、靈活性
2)訪問者模式可以對功能進行統一,可以做報表、ui、***與過濾器,適用於資料結構相對穩定的系統
缺點:1)具體元素對訪問者公布細節,也就是說訪問者關注其他類的內部細節,這個迪公尺特法則所不建議的,這樣造成了具體元素變更比較困難
2)違背了依賴倒置原則,訪問者依賴的是具體元素,而不是抽象元素
3)因此,如果乙個系統有比較穩定的資料結構,又有經常變化的功能需求,那麼訪問者模式就比較合適
訪問者模式
訪問者模式 visitor pattern 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。一 問題 集合是大多數的系統都要處理的一種容器物件,它儲存了對其它物件的引用。一般情況下,在集合上採取的...
訪問者模式
行為模式中的訪問者模式 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作,一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。動機 類層次結構中可能經常由於引入新的操作,從而將型別變得脆弱。在軟體構建過程中,由於需求的改變,某些類層次結構中常常需要增...
訪問者模式
1.說明 namespace visitorspattern 象棋類 public abstract class chess public class redchess chess public class blackchess chess 在贏的情況下的狀態 public class win ac...