訪問者模式(Visitor) 行為筆記

2021-06-09 16:14:55 字數 3291 閱讀 2497

訪問者模式(visitor)表示乙個作用於某物件結構中的各元素的操作,它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。

適用於資料結構相對穩定的系統!

一、

涉及角色

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

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

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

具體節點(concretenode)角色:實現accept操作

結構物件(objectstructure)角色:可以遍歷結構中的所有元素;提供乙個高層次的介面讓訪問者物件可以訪問每乙個元素;可以設計乙個復合物件或乙個聚集,

二、

適用範圍

1、乙個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。

2、需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作「汙染」這些物件的類。

visitor使得你可以將相關的操作集中起來定義在乙個類中。

當該物件結構被很多應用共享時,用visitor模式讓每個應用僅包含需要用到的操作。

3、定義物件結構的類很少改變,但經常需要在此結構中定義新的操作。

改變物件結構類需要重定義對所有訪問者的介面,可能需要很大的代價。如果物件結構類經常改變,那麼可能還是在這些類中定義這些操作較好

三、

優點與缺點

1)、容易增加新的操作,使用訪問者模式,增加新的操作類似於增加乙個新的訪問者類。

2)、訪問者模式將有關行為集中到乙個訪問者物件中,而不是分散到乙個個節點類。

3)、可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。

缺點:

1)、增加新的節點類很困難。每增加乙個新的節點意味著要在抽象訪問者角色中增加乙個新的抽象操作,並在每個具體訪問者類中增加相應的具體操作。

2)、破壞封裝。訪問者要求訪問並呼叫每乙個節點物件操作,使得節點物件必須暴露自己的操作和內部狀態。

注意:當實現訪問者模式時,要將盡可能多的物件瀏覽邏輯放在

visitor

類中,而不是放在它的子類裡。這樣的話,

concretevisitor

類對所訪問的物件結構依賴較少,從而使維護較為容易。

四、故事說明

23、visitor—情人節到了,要給每個mm送一束鮮花和一張卡片,可是每個mm送的花都要針對她個人的特點,每張卡片也要根據個人的特點來挑,我乙個人哪搞得清楚,還是找花店老闆和禮品店老闆做一下visitor,讓花店老闆根據mm的特點擊一束花,讓禮品店老闆也根據每個人特點擊一張卡,這樣就輕鬆多了;

訪問者模式:訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構可以保持不變。訪問者模式適用於資料結構相對未定的系統,它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,就是增加乙個新的訪問者類。訪問者模式將有關的行為集中到乙個訪問者物件中,而不是分散到乙個個的節點類中。當使用訪問者模式時,要將盡可能多的物件瀏覽邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。

抽象訪問者

public abstract class visitor
具體訪問者(concretevisitor)

public class concretevisitor extends visitor

@override

public void visitfloat(floatnode floatnode)

}

抽象節點(node)

public inte***ce  node
具體節點(concretenode)

public class floatnode implements node

@override

public void accept(visitor visitor)

public string tostring()

}

具體節點(concretenode)

public class stringnode implements node

@override

public void accept(visitor visitor)

@override

public string tostring()

}

結構物件(objectstructure)

public class objectstructure 

public void accept(visitor visitor)

}}

客戶端
package visitor;

public class client

}/*格式浮點數:2.1----f

格式字串:hello!---s*/

行為型模式 訪問者 visitor

表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作.main.cc include include swim action.h include bike action.h include run action.h include female p...

行為模式 訪問者模式 visitor 解析例子

摘要 本文深入淺出的講述了設計模式中的 模式屬於行為型模式,其意圖是表示乙個作用於某物件結構中的各元素的操作。他使你可以在不改變個元素的類的前提下定義作用與這些元素的操作。考慮乙個訪問汽車各個部件的程式,該程式需要在汽車各個部件上執行某些操作,比如 獲取名字等等,因此它可能需要定義許多操作已進行型別...

行為型模式十九 訪問者模式(Visitor)

表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。表示乙個作用於某物件結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。1.visitor 抽象訪問者角色,為該物件結構中具體元素角色宣告乙個訪問操作介面。該操作介...