訪問者模式

2021-10-05 06:03:19 字數 4639 閱讀 5590

訪問者模式:封裝一些作用於某種資料結構中的各元素的操作,它可以在不改變資料結構的前提下定義作用與這些元素的新的操作。可以遍歷不同的物件。

角色:1.visitor抽象訪問者:宣告訪問者可以訪問哪些元素。

2.concretevisitor具體訪問者:訪問者訪問到乙個類後應該做什麼。

3.element抽象元素:宣告接受哪一類訪問者訪問,程式上是通過accept方法中的引數來定義的。

4.concreteelement具體元素:實現accept方法,通常是visitor.visit(this)。

5.objectstruture結構物件:元素產生者,很少抽象出這個角色。

適用場景:需要對乙個物件結構中的物件進行很多不同並且不想關的操作。

具體實現:

通用實現

1.建立抽象元素

/**

* 抽象元素

*/public

abstract

class

element

public

void

setname

(string name)

public

intgetgrade()

public

void

setgrade

(int grade)

//我允許乙個訪問者訪問我

public

abstract

void

accept

(ivisitor visitor)

;}

2.建立具體元素1和2.各自屬性有細微不同

/**

* 具體訪問者1

* 訪問者1存在money屬性

*/public

class

concreteelement1

extends

element

public

void

setmoney

(int money)

@override

public

void

accept

(ivisitor visitor)

}

/**

* 具體元素2

* 具體元素2有職位屬性

*/public

class

concreteelement2

extends

element

public

void

setposition

(string position)

@override

public

void

accept

(ivisitor visitor)

}

3.建立訪問者介面

/**

* 訪問者介面

*/public

inte***ce

ivisitor

4.建立具體訪問者

/**

* 具體訪問者

*/public

class

visitor

implements

ivisitor

@override

public

void

visit

(concreteelement2 concreteelement2)

public string getconcreteelement1info

(concreteelement1 concreteelement1)

public string getconcreteelement2info

(concreteelement2 concreteelement2)

}

5.建立場景測試類

/**

* 場景測試類

*/public

class

client

}//生產幾個元素模擬

public

static list

getmock()

}

統計功能(統計成績之和,元素1的成績乘5,元素2的成績乘10)

1.修改訪問者介面

/**

* 訪問者介面

*/public

inte***ce

ivisitor

2.修改訪問者實現類

/**

* 具體訪問者

*/public

class

visitor

implements

ivisitor

@override

public

void

visit

(concreteelement2 concreteelement2)

//獲取元素一的資訊

public string getconcreteelement1info

(concreteelement1 concreteelement1)

//獲取元素二的資訊

public string getconcreteelement2info

(concreteelement2 concreteelement2)

//獲得元素一的成績之和

private

void

addgrade1

(int grade)

//獲得元素二的成績之和

private

void

addgrade2

(int grade)

@override

public

intgettotalgrade()

}

3.修改場景測試類

/**

* 場景測試類

*/public

class

client

system.out.

println

("總成績為:"

+visitor.

gettotalgrade()

);}//生產幾個元素模擬

public

static list

getmock()

}

多個訪問者

1.修改訪問者介面

/**

* 訪問者介面

*/public

inte***ce

ivisitor

2.新增二號訪問者,二號訪問者進行統計成績

/**

* 具體訪問者2

* 統計總成績

*/public

class

visitor2

implements

ivisitor

@override

public

void

visit

(concreteelement2 concreteelement2)

//獲得元素一的成績之和

private

void

addgrade1

(int grade)

//獲得元素二的成績之和

private

void

addgrade2

(int grade)

//獲得總成績

public

intgettotalgrade()

}

3.修改一號訪問者,一號訪問者只展示基礎資料

/**

* 具體訪問者1

* 只展示基礎資訊

*/public

class

visitor

implements

ivisitor

@override

public

void

visit

(concreteelement2 concreteelement2)

//獲取元素一的資訊

public string getconcreteelement1info

(concreteelement1 concreteelement1)

//獲取元素二的資訊

public string getconcreteelement2info

(concreteelement2 concreteelement2)

}

4.修改場景測試類

/**

* 場景測試類

*/public

class

client

system.out.

println

("總成績為:"

+visitor2.

gettotalgrade()

);}//生產幾個元素模擬

public

static list

getmock()

}

訪問者模式

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

訪問者模式

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

訪問者模式

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