訪問者模式

2021-07-09 16:49:06 字數 4436 閱讀 6391

訪問者模式

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

visitor抽象訪問者

抽象類或者介面,宣告訪問者可以訪問哪些元素,具體到程式中就是visit方法的引數定義哪些物件是可以被訪問的

concretevisitor具體訪問者

它影響訪問者到乙個類後該怎麼幹,要做什麼事情

element抽象元素

介面或者抽象類,宣告接收哪一類訪問者訪問,程式上是通過accept方法中的引數來定義的

concretelement具體元素

實現accept方法,通常是visitor.vist(this),基本上都形成了一種模式了。

objectstruturejiegou物件

元素生產者,一般容納在多個不同類。不同介面的容器,如list、set、mapdeng,在專案中,一般很少抽象出這個角色

visitor類,為該物件結構中concreteelement中的每乙個類宣告乙個visit操作

abstract class visitor

concretevisitor1和concretevisitor2類,具體訪問者,實現每個由visitor宣告的操作。每個才做實現演算法的一部分,而該演算法片斷乃是對應於結構中物件的類

class concretevisitor1 : visitor

被訪問",concreteelementa.gettype().name,this.gettype().name);

}public override void visitconcreteelementb(concreteelementb concreteelementb)

被訪問", concreteelementb.gettype().name, this.gettype().name);}}

class concretevisitor2 : visitor

被訪問", concreteelementa.gettype().name, this.gettype().name);

}public override void visitconcreteelementb(concreteelementb concreteelementb)

被訪問", concreteelementb.gettype().name, this.gettype().name);}}

element類,定義乙個accept操作,它以乙個訪問者為引數

abstract class element

concreteelementa和concreteelementb類,具體元素,實現accept操作。

class concreteelementa : element

public void operationa()

}class concreteelementb : element

public void operationb()

}

objectstructure類,能列舉 它的元素,可以提供乙個高層的介面以允許訪問者訪問它的元素

'狀態'的抽象類和'人'的抽象類

abstract class action

abstract class person

具體「狀態」類成功

class success : action

時,背後多半有乙個偉大的女人。",concreteelementa.gettype().name,this.gettype().name);

}public override void getwomanconclusion(woman concreteelementb)

時,背後大多數有乙個不成功的男人。",concreteelementb.gettype().name,this.gettype().name);}}

失敗

class failing : action

時,悶頭喝酒,誰也不用勸。。", concreteelementa.gettype().name, this.gettype().name);

}public override void getwomanconclusion(woman concreteelementb)

時,眼淚汪汪,誰也勸不了。", concreteelementb.gettype().name, this.gettype().name);}}

戀愛

class amativeeness : action

時,凡事不懂也要裝懂。", concreteelementa.gettype().name, this.gettype().name);

}public override void getwomanconclusion(woman concreteelementb)

時,遇事懂也裝作不懂。", concreteelementb.gettype().name, this.gettype().name);}}

結婚

class marriage : action

時,感慨道:戀愛遊戲終結時,『有妻徒刑』遙無期。", concreteelementa.gettype().name, this.gettype().name);

}public override void getwomanconclusion(woman concreteelementb)

時,欣慰曰:愛情長跑路漫漫,婚姻保險保平安。", concreteelementb.gettype().name, this.gettype().name);}}

「男人」類和「女人」類男人

class man : person

}

女人

class woman : person

}

類結構物件

class objectstructure

//移除

public void detach(person element)

//檢視資訊

public void display(action visitor)}}

客戶端**

1.符合單一職責原則

2.優秀的擴充套件性

3.靈活性非常高

1.具體元素對訪問者公布細節

2.具體元素變更比較困難

3.違背了依賴倒轉原則

乙個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作,也就是說用迭代器模式已經不能勝任的情景

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

訪問者模式是一種集中規整模式,特別適用於大規模重構專案,在這一階段需求已經非常清晰,原系統的功能點也已經明確,通過訪問者模式可以很容易把一些功能進行梳理,達到最終目的---功能集中化,如乙個統一的報表運算、ui展現等。

訪問者模式

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

訪問者模式

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

訪問者模式

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