java之訪問者模式

2021-09-23 13:27:09 字數 2077 閱讀 4877

封裝某些作用於某種資料結構中各元素的操作,它可以在不改變資料結構的前提下定義作用於這些元素的新的操作。

抽象訪問者(visitor)角色:宣告了乙個或者多個方法操作,形成所有的具體訪問者角色必須實現的介面。

具體訪問者(concretevisitor)角色:實現抽象訪問者所宣告的介面,也就是抽象訪問者所宣告的各個訪問操作。

抽象節點(node)角色:宣告乙個接受操作,接受乙個訪問者物件作為乙個引數。

具體節點(concretenode)角色:實現了抽象節點所規定的接受操作。

結構物件(objectstructure)角色:有如下的責任,可以遍歷結構中的所有元素;如果需要,提供乙個高層次的介面讓訪問者物件可以訪問每乙個元素;如果需要,可以設計成乙個復合物件或者乙個聚集,如list或set。

以兩個節點為例,visitor需要兩個方法分別訪問兩個節點

public inte***ce visitor
具體的visitora訪問拿到具體的node物件

public class visitora implements visitor

@override

public void visit(nodeb node)

}

node介面,接受visitor訪問

public inte***ce node
具體的節點nodea,接受訪問者訪問並返回自身物件

public class nodea implements node 

public string operationa()

}

具體的節點nodeb,接受訪問者返回自身物件

public class nodeb implements node 

public string operationb()

}

擁有節點的聚集物件

public class objectstructure 

public void addnode(node node)

public void deletenode(node node)

public void action(visitor visitor)

}}

測試類

public class visitortest 

}

node介面物件accept接受visitor的訪問,visitor呼叫visit方法訪問node物件並動態傳入具體的node實現類(nodea,nodeb等),然後對具體的node實現類操作,從而達到不修改原來node集合的資料結構的情況下運算元據,例如這裡如果再新增乙個節點nodec,只需要在visitor介面中增加乙個對nodec的訪問,然後將nodec增加到集合中,那麼我就可以實現對nodec的操作;

假設不用訪問者模式,由於集合中存放的是node介面,往集合中增加介面實現類,之後在想取得具體的實現類是很難實現的,例如上面例子中的objectstructure中存放nodea跟nodeb物件,從objectstructure取出來全是node物件不能向下轉型成具體的實現類,因此不能針對具體實現類操作,用訪問者模式則會動態的訪問到子類的重寫的方法(其實是實現具體的介面)從而獲取到具體的子類例項物件;

好的擴充套件性

能夠在不修改物件結構中的元素的情況下,為物件結構中的元素新增新的功能。

好的復用性

可以通過訪問者來定義整個物件結構通用的功能,從而提高復用程度。

分離無關行為

可以通過訪問者來分離無關的行為,把相關的行為封裝在一起,構成乙個訪問者,這樣每乙個訪問者的功能都比較單一。

物件結構變化很困難

不適用於物件結構中的類經常變化的情況,因為物件結構發生了改變,訪問者的介面和訪問者的實現都要發生相應的改變,代價太高。

破壞封裝

訪問者模式通常需要物件結構開放內部資料給訪問者和objectstructrue,這破壞了物件的封裝性。

Java設計模式之訪問者模式

訪問者的基本想法是 軟體系統擁有乙個由許多物件構成的 比較穩定的物件結構,這些物件的類都擁有乙個accept方法用來接收對訪問者物件的訪問,而訪問者是乙個介面,他擁有乙個visit方法,這個方法對訪問到的物件結構中不同型別的元素做出不同的處理。在物件結構的一次訪問過程中,我們遍歷整個物件結構,每乙個...

Java設計模式之訪問者模式

單個單子的介面 相當於element public inte ce bill 消費的單子 public class consumebill implements bill public void accept accountbookviewer viewer public double getamo...

Java 訪問者設計模式

訪問者模式,是行為型設計模式之一。訪問者模式是一種將資料操作與資料結構分離的設計模式,它可以算是 23 中設計模式中最複雜的乙個,但它的使用頻率並不是很高,大多數情況下,你並不需要使用訪問者模式,但是當你一旦需要使用它時,那你就是需要使用它了。當我們想要在不改變類的情況下為物件結構的類定義新操作時,...