訪問者模式是一種將算法與對象結構分離的軟件設計模式。這種模式的工作方法如下:假設擁有一個由許多對象構成的對象結構,這些對象的類都擁有一個accept方法用來接受訪問者對象;訪問者是一個接口,它擁有一個visit方法,這個方法對訪問到的對象結構中的不同類型做出不同的反應;在對象結構的一次訪問過程中,遍歷整個對象結構,對每個元素都實施accept方法,在每個元素的accept方法中回調訪問者的visit方法,從而使訪問者得以處理對象結構的每個元素;可以針對對象結構設計不同的訪問者類型來完成不同的操作
trait City {
def accept(visitor: Visitor): String
}
class Beijing extends City {
override def accept(visitor: Visitor): String = {
visitor.visit(this)
}
}
class Shanghai extends City {
override def accept(visitor: Visitor): String = {
visitor.visit(this)
}
}
class Shenzhen extends City {
override def accept(visitor: Visitor): String = {
visitor.visit(this)
}
}
class TraveCities extends City {
val cities = Array[City](new Beijing, new Shanghai, new Shenzhen)
override def accept(visitor: Visitor): String = {
for (c <- cities) println(c.accept(visitor))
"visit all cities"
}
}
trait Visitor {
def visit(beijing: Beijing): String
def visit(shanghai: Shanghai): String
def visit(shenzhen: Shenzhen): String
}
class SingleVisitor extends Visitor {
override def visit(beijing: Beijing): String = {
"single visit beijing"
}
override def visit(shanghai: Shanghai): String = {
"single visit shanghai"
}
override def visit(shenzhen: Shenzhen): String = {
"single visit shenzhen"
}
}
class DoubleVisitor extends Visitor {
override def visit(beijing: Beijing): String = {
"double visit beijing"
}
override def visit(shanghai: Shanghai): String = {
"double visit shanghai"
}
override def visit(shenzhen: Shenzhen): String = {
"double visit shenzhen"
}
}
object VisitorTest {
def main(args: Array[String]): Unit = {
val travelcities = new TraveCities
travelcities.accept(new SingleVisitor)
travelcities.accept(new DoubleVisitor)
}
}
程序輸出
single visit beijing
single visit shanghai
single visit shenzhen
double visit beijing
double visit shanghai
double visit shenzhen
參考文章
訪問者模式