なんじゃくにっき

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

Scala de Design Pattern: Composite

Compositeパターン。
割と普通。

abstract class Node(name: String) {
override def toString = name
def addChild(node: Node): Unit
def callRecursively = println(toString)
}

class InnerNode(name: String) extends Node(name: String) {
var children = List[Node]()
def addChild(node: Node) = children ::= node
override def callRecursively = {
super.callRecursively
children.foreach(_.callRecursively)
}
}

class LeafNode(name: String) extends Node(name: String) {
def addChild(node: Node) = throw new RuntimeException("葉ノードに子ノードは追加できまへん")
}

object Main {
def main(args: Array[String]) = {
val rootNode = new InnerNode("根っこ")
val InnerNodeA = new InnerNode("内部節A")
val InnerNodeB = new InnerNode("内部節B")
val LeafNodeA = new LeafNode("葉A")
val LeafNodeB = new LeafNode("葉B")

rootNode.addChild(InnerNodeA)
rootNode.addChild(InnerNodeB)
InnerNodeA.addChild(LeafNodeA)
InnerNodeA.addChild(LeafNodeB)

rootNode.callRecursively
}
}

// 【実行結果】
// 根っこ
// 内部節B
// 内部節A
// 葉B
// 葉A