在訪問者模式(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...