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