Visitorパターン。
Accepterをパターンマッチングで処理できるので、
Acceptor毎にvisitメソッドを定義しなくて良い。
package designpattern.visitortrait Acceptor {
def accept(visitor: Visitor) = visitor.visit(this)
}case class AcceptorImpl1 extends Acceptor
case class AcceptorImpl2 extends Acceptortrait Visitor {
val name: String
def visit(acceptor: Acceptor): Unit =
acceptor match {
case a:AcceptorImpl1 => println(name + " -> " + a)
case a:AcceptorImpl2 => println(name + " -> " + a)
case _ =>
}
}class VisitorImpl1 extends Visitor {
val name = "VisitorImpl1"
}class VisitorImpl2 extends Visitor {
val name = "VisitorImpl2"
}object Main {
def main(args: Array[String]) = {
val a = new AcceptorImpl1
a.accept(new VisitorImpl1)
a.accept(new VisitorImpl2)
}
}