なんじゃくにっき

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

Scala de Design Pattern: Decorator

 Decoratorパターンを実装する。
既存のクラスのインターフェイスを保ったまま振る舞いを変えるのがDecorator。
 
Scalaではnewするときにもtraitを付与できるのを利用する。

trait Animal {
def roar: Unit
}

class AnimalImpl extends Animal{
def roar = println("ぼく、どうぶつ!")
}

trait WingedAnimal extends Animal {
abstract override def roar = {
super.roar
println("ぼく、とべるよ!")
}
}

trait FangedAnimal extends Animal {
abstract override def roar = {
super.roar
println("はむはむしてやんよ!")
}
}

object Main {
def main(args: Array[String])= {
val doragon = new AnimalImpl with WingedAnimal with FangedAnimal
doragon.roar
}
}

// 【実行結果】
// ぼく、どうぶつ!
// ぼく、とべるよ!
// はむはむしてやんよ!