なんじゃくにっき

プログラミングの話題中心。

Scala de Design Pattern: Visitor

 Visitorパターン。
Accepterをパターンマッチングで処理できるので、
Acceptor毎にvisitメソッドを定義しなくて良い。

package designpattern.visitor

trait Acceptor {
def accept(visitor: Visitor) = visitor.visit(this)
}

case class AcceptorImpl1 extends Acceptor
case class AcceptorImpl2 extends Acceptor

trait 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)
}
}