有這麼一則笑話:
話說有對一年輕夫婦生了一對雙胞胎男孩。倆小子長得一模一樣,還特別調皮。 平時一般都是媽媽照顧倆小子。可是有一天, 媽媽出差了,晚上爸爸給倆小子胎洗完澡,把他放到床上,催他們快睡覺,小寶就笑起來了:「哥哥都洗兩次了,我都還沒洗澡呢。」。爸爸:「還好不是餵飯」 。
訪問者模式(visitor)解決方案
訪問者模式適用於資料結構相對穩定的系統(兩個小孩、負責餵飯和洗澡),它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。資料結構的每乙個節點都可以接受乙個訪問者的呼叫,此節點向訪問者物件傳入節點物件,而訪問者物件則反過來執行節點物件的操作。這樣的過程叫做"雙重分派"。節點呼叫訪問者,將它自己傳入,訪問者則將某演算法針對此節點執行。
訪問者模式涉及到抽象訪問者角色、具體訪問者角色、抽象節點角色、具體節點角色、結構物件角色以及客戶端角色。
抽象訪問者(visitor)角色:宣告了乙個或者多個訪問操作,形成所有的具體元素角色必須實現的介面。如visitor類
具體訪問者(concretevisitor)角色:實現抽象訪問者角色所宣告的介面,也就是抽象訪問者所宣告的各個訪問操作。 如wash類、feed類。
抽象節點(element)角色:宣告乙個接受操作,接受乙個訪問者物件作為乙個參量。如child類。
具體節點(concreteelement)角色:實現了抽象元素所規定的接受操作。如son類。
結構物件(obiectstructure)角色:可以遍歷結構中的所有元素;如obiectstructure
visitor類如下:
public
abstract
class
visitor
wash類如下:
public
class
wash:visitor
}feed類如下:
public
class
feed:visitor
}child類如下:
public
abstract
class
child
public
abstract
void
accept(visitor visitor);
}son類如下:
public
class
son:child
public
override
void
accept(visitor visitor)
}obiectstructure類如下:
public
class
obiectstructure
public
void
remove(child ch)
public
void
takecareofchildren(visitor visitor)}}
客戶端呼叫如下:
public
class
client
}
設計模式 訪問者模式(二十三)
軟體領域中的設計模式的重要性不言而喻。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型。雖然知道這些特性的定義但是並沒有做到真正的理解,這樣特性有什麼作用?用於什麼場合中等等問題,帶著疑問開始學習設計模式,主要參考 大話設計模式 和 設計模式 可復用物件導向軟體的基礎 兩本書。訪問者...
設計模式二十三(訪問者模式)
訪問者模式 visitor 表示乙個作用於物件結構中的各個元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作 類圖的 訪問者模式的 如下 public abstract class visitor public class concretevisitor1 extends v...
設計模式之訪問者模式
先看一下下面這段 class person public string getaction public void setaction string action public void getconclusion else if action exciting else if action gri...