設計模式 訪問者模式

2021-09-05 01:28:53 字數 2967 閱讀 5081

男人成功時,背後多半有乙個偉大女人。女人成功時,背後大多有乙個不成功的男人。

男人失敗時,悶頭喝酒,誰也不用勸,女人失敗時,眼淚汪汪,誰也勸不了。

男人戀愛時,凡事不懂也要裝懂。女人戀愛時,遇事懂也要裝作不懂。

男人結婚時,感慨道:戀愛遊戲終結時,'有妻徒刑'遙無期。女人結婚時,欣慰曰:愛情長跑路漫漫,婚姻保險保平安。

網上關於男人與女人區別的討論,還有點意思。我們就用這個來學習最複雜的乙個設計模式-訪問者模式。

首先把這個男女的區別寫到控制台上,我們很容易用person類,man類與woman 類寫好了,其中man與woman類中根據行為的不同通過if else 狀態實現不同的區別。

但是我們要增加乙個結婚的狀態,我們要修改兩個類的分支判斷,顯然是很不合適的。

這裡關鍵在於人只分為男人和女人,這個性別的分類是穩定的,所以可以在狀態類中,增加男人反應和女人反應兩個方法。方法個數是穩定的,不會很容易的發生變化。而人抽象類彙總只有乙個抽象方法,接受,它是用來獲得狀態物件的,每一種具體狀態都繼承狀態抽象類,實現兩個反應的方法。

//成功

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 amativeness : 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);}}

abstract class person

//男人

class man : person

}//女人

class woman : person

}//增加結構

class objectstructure

//移除

public void detach(person element)

//檢視顯示

public void display(action visitor)}}

class program}}

這裡要提一下當中用到一種雙分派的技術,首先在客戶程式中將具體狀態作為引數傳遞給男人完成了一次分派,然後男人類呼叫作為引數的具體狀態中的方法男人反應,同時將自己作為引數傳遞進去,這便完成了第二次分派,雙分派意味著的哦到執行的操作決定於請求的種類和兩個接收者的型別。接受方法就是乙個雙分派的操作,它得到執行的操作不僅決定於狀態類的具體狀態,還決定於它訪問的人的類別。

物件結構類:由於總是需要男人和女人在不同狀體的對比,所以我們需要乙個物件結構類來針對不同的狀態遍歷男人和女人,得到不同的反應。

這樣的話,如果要增加結婚狀態來考察男人和女人的反應,只要增加乙個狀態子類,就可以在客戶端呼叫來檢視。不需要改動其他任何類的**。

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

什麼時候使用訪問者模式呢?訪問者模式適用於資料結構相對穩定的系統。

它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。

訪問者模式的目的要把處理從資料結構分離出來,對於比較穩定的資料結構,又有易於變化的演算法的話,使用訪問者模式就是比較合適的,因為訪問者模式使得演算法操作的增加變得容易。

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

那訪問者的缺點就是使增加新的資料結構變得困難了。

從網上看的所謂的男人和女人的對比,都是不準確的。其實男人和女人最大的區別就是,比上不足,比下有餘(手動滑稽).

設計模式 訪問者模式

訪問者模式是一種資料操作與資料結構分離的設計模式,訪問者模式的基本想法是,軟體系統中擁有乙個由許多物件構成的 比較穩定的物件結構,這些物件的類都擁有乙個accept方法用來接受訪問者物件的訪問。訪問者是乙個介面,它擁有乙個visit方法,這個方法對訪問到的物件結構中不同型別的元素作出不同的處理。在物...

設計模式 訪問者模式

訪問者模式 visitor 表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。例子 男人和女人在不同的狀態下會有不同反應,採用訪問者模式,可以增加狀態很方便 抽象狀態類 class action 男人反應 virtual void getwom...

設計模式 訪問者模式

在訪問者模式 visitor pattern 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。1 符合單一職責原則。2 優秀...