訪問者(Visitor)
情景:男人和女人!
定義:表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。
結構圖:
interface State {
void GetMan(Man concreteElementA);
void GetWoman(Woman concreteElementB);
}
public class Fail implements State{
@Override
public void GetMan(Man concreteElementA) {
System.out.println(concreteElementA.getClass() + "said");
}
@Override
public void GetWoman(Woman concreteElementB) {
System.out.println(concreteElementB.getClass() +"cry");
}
}
public class Success implements State{
@Override
public void GetMan(Man concreteElementA) {
System.out.println(concreteElementA.getClass() +" happy");
}
@Override
public void GetWoman(Woman concreteElementB) {
System.out.println(concreteElementB.getClass() +" cry");
}
}
interface Person {
void Accept(State visitor);
}
public class Man implements Person{
@Override
public void Accept(State visitor) {
visitor.GetMan(this);
}
}
public class Woman implements Person{
@Override
public void Accept(State visitor) {
visitor.GetWoman(this);
}
}
public class ObjectStructure {
private List<Person> list = new ArrayList<Person>();
public void Attach(Person person){
list.add(person);
}
public void Detach(Person person){
list.remove(person);
}
public void Display(State visitor){
for (Person e : list) {
e.Accept(visitor);
}
}
}
public class Client {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure();
o.Attach(new Man());
o.Attach(new Man());
o.Attach(new Woman());
Success visitor = new Success();
o.Display(visitor);
Fail v2= new Fail();
o.Display(v2);
}
}
訪問者模式的幾個特點:訪問者模式把資料結構和作用於結構上的操作解耦合,使得操作集合可相對自由地演化。
訪問者模式適用於資料結構相對穩定演算法又易變化的系統。因為訪問者模式使得演算法操作增加變得容易。若系統資料結構物件易於變化,經常有新的資料物件增加進來,則不適合使用訪問者模式。
訪問者模式的優點是增加操作很容易,因為增加操作意味著增加新的訪問者。訪問者模式將有關行為集中到一個訪問者物件中,其改變不影響系統資料結構。其缺點就是增加新的資料結構很困難。
適用情況 :
1) 一個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。
2) 需要對一個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作“汙染”這些物件的類。Visitor模式使得你可以將相關的操作集中起來 定義在一個類中。
3) 當該物件結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作。
4) 定義物件結構的類很少改變,但經常需要在此結構上定義新的操作。改變物件結構類需要重定義對所有訪問者的介面,這可能需要很大的代價。如果物件結構類經常改變,那麼可能還是在這些類中定義這些操作較好。
相關文章
- C++設計模式 - 訪問器模式(Visitor)C++設計模式
- 【設計模式】詳解訪問者(Visitor)模式-有多段程式碼出沒設計模式
- 訪問者模式模式
- python-訪問者模式Python模式
- 行為模式-訪問者模式模式
- 深入淺出訪問者模式模式
- DesignPattern_訪問者模式_19模式
- 設計模式(十六)——訪問者模式設計模式
- 設計模式(二十三)訪問者設計模式
- 極簡設計模式-訪問者模式設計模式
- 設計模式 - ASM 中的訪問者模式設計模式ASM
- 設計模式學習之訪問者模式設計模式
- C#設計模式之訪問者模式C#設計模式
- 訪問使用者中心實現認證
- 【趣味設計模式系列】之【訪問者模式】設計模式
- oralce 跨使用者訪問表 同義詞
- redis設計統計使用者訪問量Redis
- 如何用 Redis 統計使用者訪問量?Redis
- 15.java設計模式之訪問者模式Java設計模式
- 儲存過程訪問其他使用者的表的問題儲存過程
- nginx配置kibana訪問使用者名稱和密碼認證、及無認證訪問配置Nginx密碼
- Gitlab怎麼使用訪問令牌訪問Gitlab
- 訪問統計(排除爬蟲訪問)爬蟲
- 私網使用者通過Smart NAT 訪問Internet
- k8s建立普通使用者訪問dashboardK8S
- laravel 單使用者 單IP 頻次訪問限制Laravel
- Java進階篇設計模式之十 ---- 訪問者模式和中介者模式Java設計模式
- 使用 Libki 來管理公共使用者訪問計算機計算機
- 【學習】SQL基礎-019-控制使用者訪問SQL
- 設計模式學習-使用go實現訪問者模式設計模式Go
- FRP指定訪問者:安全地暴露內網服務FRP內網
- 聊聊OOP中的設計原則以及訪問者模式OOP模式
- 日誌服務之分析使用者訪問行為
- 「補課」進行時:設計模式(18)——訪問者模式設計模式
- git hub 無法訪問 訪問速度慢Git
- 九、GO 程式設計模式:K8S VISITOR 模式Go程式設計設計模式K8S
- php之像訪問陣列一樣訪問物件PHP陣列物件
- 訪問github出現無法訪問此網站Github網站
- 軟體設計模式系列之二十五——訪問者模式設計模式