[scala]訪問者模式

訪問者模式是一種將算法與對象結構分離的軟件設計模式。這種模式的工作方法如下:假設擁有一個由許多對象構成的對象結構,這些對象的類都擁有一個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

參考文章
訪問者模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章