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