訪問者模式

2022-01-11 01:18:23 字數 2759 閱讀 2893

1、前奏理解

書中是以人類的性別來引出這個模式,因為只有兩種性別,也就是說資料結構是穩定的,因此非常適合用來理解訪問者模式,而這也是訪問者模式使用的前提「資料結構相對穩定」。但是,有一句話說的我也是一驚:這算是gof中最複雜的乙個模式!所以這裡我僅僅把我未入門的理解寫下來。

2、定義

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

3、使用與分析

用處:訪問者模式適用於資料結構相對穩定的系統;它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以比較自由的演化。從他的用處上可以看出來,他的目的就是把資料處理從資料結構分離出來。

優點:訪問者模式的優點就是增加新的操作很容易,因為增加新的操作就意味著增加乙個新的訪問者;而訪問者模式將有關的行為集中到乙個訪問者物件中。

缺點:從他的適用情形就可以看出來,他的缺點就是增加新的資料結構變得困難了。

4、**示例

下面以書中的例子來簡單理解一下

1)首先需要建立兩個抽象類:元素的基類,狀態的基類:

abstract

class

person

abstract

class

vaction

view code

2)建立具體的狀態類

/*

具體的狀態類,每一種操作建立為乙個狀態類

*/class

success:vaction

時,背後多半有乙個偉大的女人!",

pconcreteelementa.gettype().name,

this

.gettype().name);

}public

override

void

getwomanconclusion(woman pconcreteelementb)

時,背後多半有乙個不成功的男人!",

pconcreteelementb.gettype().name,

this

.gettype().name);}}

class

fail : vaction

時,悶頭喝酒,誰也不用勸!",

pconcreteelementa.gettype().name,

this

.gettype().name);

}public

override

void

getwomanconclusion(woman pconcreteelementb)

時,眼淚汪汪,誰也勸不了!",

pconcreteelementb.gettype().name,

this

.gettype().name);}}

class

amativeness : vaction

時,凡事不懂也要裝懂!",

pconcreteelementa.gettype().name,

this

.gettype().name);

}public

override

void

getwomanconclusion(woman pconcreteelementb)

時,遇事懂也要裝作不懂!",

pconcreteelementb.gettype().name,

this

.gettype().name);}}

//如果需要新增乙個狀態/演算法,那麼只需要在這裡增加乙個狀態類即可

class

marriage : vaction

時,感慨道:戀愛遊戲結束時,有期徒刑遙無期!",

pconcreteelementa.gettype().name,

this

.gettype().name);

}public

override

void

getwomanconclusion(woman pconcreteelementb)

時,感慨道:愛情長跑路漫漫,婚姻保險報平安!",

pconcreteelementb.gettype().name,

this

.gettype().name);}}

3)建立具體的元素類,相當於是具體的資料結構操作類:

/*

雙分派技術:

* 首先在客戶端中將具體狀態作為引數傳遞給「男人」類,完成了一次分派;

* 然後「男人」類呼叫作為具體狀態中的方法「男人反應」同時將自己作為引數傳遞進去,這就完成了第二次分派

*/class man:person

}class woman : person

}

4)還需要建立乙個物件結構類,由於總是需要不同元素之間不同狀態的操作,所以還需要建立乙個物件結構,遍歷所有元素,然後得到每乙個元素的操作:

class objstructure

/// /// 移除乙個要素

///

///

public void detachelement(person pelement)

public void display(vaction pvisitor)

}

5)在客戶端中通過物件結構傳遞引數狀態來得到每乙個要素的具體反應:

static void main(string args)

以上是根據書中的例子具體抄寫的**,感覺比純理論**更容易理解。

訪問者模式

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

訪問者模式

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

訪問者模式

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