設計模式(21) 訪問者模式

2022-02-11 11:04:03 字數 3661 閱讀 8530

一、定義

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

解釋:乙個物件,如果它的元素是固定的,那麼可以使用訪問者模式定義它們的操作,使得操作可以自由的增加或者減少而不影響系統的其它部分。

二、uml類圖及基本**

基本**:

abstract

class

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

abstract

class

element

class

concreteelementa : element

public

void

operationa()

}class

concreteelementb : element

public

void

operationb()

}class

objectstructure

public

void

detach(element element)

public

void

accept(visitor visitor)}}

客戶端呼叫及其允許結果:

三、例項說明

介紹男人和女人之間的區別。現在元素包括男人和女人是固定的,但是它們的區別即操作不多種多樣的,例如:男人成功時,背後多半有乙個偉大的女人,女人成功時,背後大多有乙個不成功的男人;男人失敗時,悶頭喝酒,誰也不用勸,女人失敗時,眼淚汪汪,誰也勸不了,等等。**說明:

首先編寫抽象人類和具體的物件男人、女人:

abstract

class

person

class

man : person

}class

woman : person

}

然後編寫元素的抽象操作類和具體的操作行為:

abstract

class

action

class

success : action

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

", concreteelementa.gettype().name, this

.gettype().name);

}public

override

void

getwomanconclusion(woman concreteelementb)

時,背後大多有乙個不成功的男人

", concreteelementb.gettype().name, this

.gettype().name);}}

class

fail : action

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

", concreteelementa.gettype().name, this

.gettype().name);

}public

override

void

getwomanconclusion(woman concreteelementb)

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

", concreteelementb.gettype().name, this

.gettype().name);}}

最後編寫乙個結構類,它列舉元素,提供乙個高層的介面以允許訪問者訪問它的元素

class

objectstructure

public

void

detach(person element)

public

void

display(action action)}}

客戶端呼叫及其結果:

四、優缺點及適用場景

優點:訪問者模式使得新增新的操作變得容易。如果一些操作依賴於乙個複雜的結構物件的話,那麼一般而言,新增新的操作會變得很複雜。而使用訪問者模式,增加新的操作就意味著新增乙個新的訪問者類。因此,使得新增新的操作變得容易。

缺點:增加新的元素類變得困難。每增加乙個新的元素意味著要在抽象訪問者角色中增加乙個新的抽象操作,並在每乙個具體訪問者類中新增相應的具體操作。

適用場景:

說白了,就是能顯示其優點迴避其缺點的地方都可以適用。

設計模式 21 訪問者模式(Visitor)

21 訪問者模式 visitor 訪問者模式把資料結構和作用於結構上的操作解耦合,使得對資料操作可相對自由地演化。訪問者模式適用於資料結構相對穩定,演算法又易變化的系統。因為訪問者模式使得演算法操作增加變得容易。若系統資料結構物件易於變化,經常有新的資料物件增加進來,則不適合使用訪問者模式。訪問者模...

21 訪問者模式(Visitor)

訪問者模式把資料結構和作用於結構上的操作解耦合,使得操作集合可相對自由地演化。訪問者模式適用於資料結構相對穩定演算法又易變化的系統。因為訪問者模式使得演算法操作增加變得容易。若系統資料結構物件易於變化,經常有新的資料物件增加進來,則不適合使用訪問者模式。訪問者模式的優點是增加操作很容易,因為增加操作...

設計模式 訪問者模式

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