訪問者模式

2021-09-26 13:14:41 字數 2812 閱讀 4598

寫這篇文章之前,我也看了十幾篇網路大牛寫的訪問者設計模式的文章,都說這個訪問者模式是最複雜的乙個,但是我覺得跟其他的設計模式並沒有太多的不同,因此自己整理了一下,相信大多數人都能看懂。

一、認識訪問者模式

1、概念

封裝一些作用於某種資料結構中的各元素的操作,它可以在不改變這個資料結構的前提下,定義作用於這些元素的新操作。

如何來理解呢?舉個例子來說吧,假如我們都玩過王者榮耀。每個英雄都有三個基本的技能,但是不同的玩家操作英雄技能實現的方式是不一樣的。比如說你玩韓信只能送人頭,夢淚玩韓信那就是百戰百勝。

在這個例子中,莊周和甄姬的三個基本的技能是不變的,但是訪問者模式能夠在這三個技能之上實現一些不同的效果。我們可以畫一張類圖進一步去了解它。

2、類圖

相信說這種模式比較複雜的都是因為其類圖吧,不過我們為每乙個模組進行著色之後就能發現其實沒那麼麻煩。以上類圖一共涉及到了六個角色:

(1) vistor(抽象訪問者):為該物件結構中具體元素角色宣告乙個訪問操作介面。就好像是王者榮耀裡面不同的玩家。

(2) concretevisitor(具體訪問者):每個具體訪問者都實現了vistor中定義的操作。就好比是具體某乙個玩家。

(3) element(抽象元素):定義了乙個accept操作,以visitor作為引數。可以模擬成王者裡面英雄的模板。

(4) concreteelement(具體元素):實現了element中的accept()方法,呼叫vistor的訪問方法以便完成對乙個元素的操作。可以表示為具體某乙個英雄,好比是莊周和甄姬。

(5) objectstructure(物件結構):可以是組合模式,也可以是集合;能夠列舉它包含的元素;提供乙個介面,允許vistor訪問它的元素。也就是莊周和甄姬允許外界訪問的元素。

有了這個概念,下面我們就可以使用**來分析一下了。

二、**實現

第一步:定義抽象元素(英雄的模板)

public

abstract

class

hero

第二步:定義具體元素(具體某乙個英雄)首先我們可以定義甄姬

//甄姬

public

class

zhenhero

extends

hero

//自身的技能

public

void

operate()

}

還有乙個莊周

//莊周

public

class

zhuanghero

extends

hero

//自身的技能

public

void

operate()

}

第三步:定義抽象訪問者(玩家)

//玩家可以訪問甄姬和莊周的技能

public

inte***ce

player

第四步:定義具體訪問者(玩家我和其他玩家)首先是我自己操作

public

class

playerme

implements

player

@override

public

void

visitzhen

(zhenhero element)

}

然後是其他玩家操作

public

class

playerothers

implements

player

@override

public

void

visitzhen

(zhenhero element)

}

第五步:定義物件結構

public

class

objectstructure

}public

void

addhero

(hero hero)

}

第六步:客戶端測試一下

public

class

client

}

最後一步我們就能看到結果了

這就是訪問者模式。

三、分析訪問者模式

訪問者模式使用的條件在於物件的結構一般不宜發生改變,但是操作缺不一樣的情況。比如複雜的集合物件、xml文件解析、編譯器的設計等就常常會用到這個模式。

優點在於訪問者模式解決的問題,也就是使用場景,缺點就是不使用物件結構宜發生改變的情況。

訪問者模式

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

訪問者模式

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

訪問者模式

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