訪問者模式

2021-09-19 03:33:47 字數 3186 閱讀 4802

在訪問者模式(visitor pattern)中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。例如:顧客在商場購物時放在「購物車」中的商品,顧客主要關心所選商品的價效比,而收銀員關心的是商品的**和數量。

意圖:主要將資料結構與資料操作分離。

主要解決:穩定的資料結構和易變的操作耦合問題。

何時使用:需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而需要避免讓這些操作"汙染"這些物件的類,使用訪問者模式將這些封裝到類中。

如何解決:在被訪問的類裡面加乙個對外提供接待訪問者的介面。

關鍵**:在資料基礎類裡面有乙個方法接受訪問者,將自身引用傳入訪問者。

優點:1、符合單一職責原則。 2、優秀的擴充套件性。 3、靈活性。

缺點:1、具體元素對訪問者公布細節,違反了迪公尺特原則。 2、具體元素變更比較困難。 3、違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。

使用場景:1、物件結構中物件對應的類很少改變,但經常需要在此物件結構上定義新的操作。 2、需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而需要避免讓這些操作"汙染"這些物件的類,也不希望在增加新操作時修改這些類。

注意事項:訪問者可以對功能進行統一,可以做報表、ui、***與過濾器。

訪問者模式包含以下主要角色:

1.抽象訪問者(visitor)角色:定義乙個訪問具體元素的介面,為每個具體元素類對應乙個訪問操作 visit() ,該操作中的引數型別標識了被訪問的具體元素。

2.具體訪問者(concretevisitor)角色:實現抽象訪問者角色中宣告的各個訪問操作,確定訪問者訪問乙個元素時該做什麼。

3.抽象元素(element)角色:宣告乙個包含接受操作 accept() 的介面,被接受的訪問者物件作為 accept() 方法的引數。

4.具體元素(concreteelement)角色:實現抽象元素角色提供的 accept() 操作,其方法體通常都是 visitor.visit(this) ,另外具體元素中可能還包含本身業務邏輯的相關操作。

5.物件結構(object structure)角色:是乙個包含元素角色的容器,提供讓訪問者物件遍歷容器中的所有元素的方法,通常由 list、set、map 等聚合類實現。

其結構圖如圖所示:

* @description: 抽象訪問者

* @author: ljx

* @date: 2023年4月17日 下午1:55:23

*/public inte***ce visitor

/** *

* @classname: concretevisitora

* @description: 具體訪問者

* @author: ljx

* @date: 2023年4月17日 下午2:02:26

*/public class concretevisitora implements visitor

public void visit(concreteelementb element)

}/**

* * @classname: concretevisitorb

* @description: 具體訪問者

* @author: ljx

* @date: 2023年4月17日 下午2:02:42

*/public class concretevisitorb implements visitor

public void visit(concreteelementb element)

}/**

* * @classname: element

* @description: 抽象元素類

* @author: ljx

* @date: 2023年4月17日 下午1:57:48

*/public inte***ce element

/** *

* @classname: concreteelementa

* @description: 具體元素類

* @author: ljx

* @date: 2023年4月17日 下午2:01:08

*/public class concreteelementa implements element

public string operationa()

}/**

* * @classname: concreteelementb

* @description: 具體元素類

* @author: ljx

* @date: 2023年4月17日 下午2:01:04

*/public class concreteelementb implements element

public string operationb()

}/**

* * @classname: objectstructure

* @description: 物件構件角色

* @author: ljx

* @date: 2023年4月17日 下午2:06:00

*/public class objectstructure

}public void add(element element)

public void remove(element element)

}public class visitortest

}結果:

具體訪問者a訪問-->具體元素a的操作。

具體訪問者a訪問-->具體元素b的操作。

----------------------------------

具體訪問者b訪問-->具體元素a的操作。

具體訪問者b訪問-->具體元素b的操作。

... ...,歡迎指正!

訪問者模式

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

訪問者模式

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

訪問者模式

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