訪問者模式

2021-10-04 18:42:18 字數 2365 閱讀 2632

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

vistor(抽象訪問者):抽象訪問者為物件結構中每乙個具體元素類concreteelement宣告乙個訪問操作,從這個操作的名稱或引數型別可以清除知道需要放翁的具體元素的型別,具體訪問者需要實現這些操作方法,定義對這些元素的訪問操作.

concrervisitor(具體訪問者):具體訪問者實現了每個由抽象訪問者宣告的操作,每乙個操作用於訪問物件結構中一種型別的元素.

element(抽象元素):抽象元素一般是抽象類或者介面,它定義乙個accept()方法,該方法通常以乙個抽象訪問者作為引數.

objectstructure(物件結構):物件結構是乙個元素的集合,它用於存放元素物件,並且提供了遍歷其內部元素的方法.它可以結合組合模式來實現,也可以是乙個簡單的幾何物件,如乙個list物件或乙個set物件.

public

inte***ce

element

public

class

concreteelementa implements element

public

void

operationa()

}

public

class

concreteelementb implements element

public

void

operationb()

}

public

class

elementlist

}public

void

addelement

(element element)

public

void

removeelement

(element element)

}

public

abstract

class

visitor

public

class

concretevisitora extends visitor

@override

public

void

visit

(concreteelementb concreteelementb)

}

public

class

concretevisitorb extends visitor

@override

public

void

visit

(concreteelementb concreteelementb)

}

public

class

client

}

主要優點:

1)增加新的訪問操作很方便.使用訪問者模式,增加新的訪問操作就意味著增加乙個新的工具訪問者類,實現簡單,無須修改源**,符合"開閉原則"

2)將有關元素物件的訪問行為集中到乙個訪問者物件中,而不是分散在乙個個的元素類中.類的職責更加清晰,有利於物件結構中元素物件的復用,相同的物件結構可以供多個不同的訪問者訪問.

3)讓使用者能夠在不修改現有元素類層次結構的情況下,定義作用於該層次結構的操作.

主要缺點:

1)增加新的元素類很困難.在訪問者模式中,每增加乙個新的元素類都意味著要在抽象訪問者角色中增加乙個新的抽象操作,並在每乙個具體訪問者類中增加相應的具體操作,這違背了"開閉原則"的要求.

2)破壞封裝.訪問者模式要求訪問者物件訪問並呼叫每個元素物件的操作,這意味著元素物件有時又必須暴露一些自己的內部操作和內部狀態,否則無法供訪問者訪問.

適用場景:

1)乙個物件結構包含多個型別的物件,希望對這些物件實施一些依賴其具體型別的操作.在訪問者中針對每一種具體的型別都提供了乙個訪問操作,不同型別的物件可以有不同的訪問操作.

2)需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而需要避免讓這些操作"汙染"這些物件的類,也不希望在增加新操作時修改這些類.訪問者模式使得我們可以將相關的訪問操作集中起來定義在訪問者類中,物件結構可以被多個不同的訪問者類所使用,將物件本身與物件的訪問操作分離.

3)物件結構中物件對應的類很少改變,但經常需要在此物件結構上定義新的操作.

訪問者模式

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

訪問者模式

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

訪問者模式

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