Skip to content

Instantly share code, notes, and snippets.

@Shinpeim
Last active August 29, 2015 13:58
Show Gist options
  • Save Shinpeim/10394992 to your computer and use it in GitHub Desktop.
Save Shinpeim/10394992 to your computer and use it in GitHub Desktop.
もうちょっとよくした
trait Nyan {
def nyan(arg: String): String
}
// デコレーターで拡張される側のクラス
class NyanImpl extends Nyan {
def nyan(arg: String): String = {
arg + "にゃーん"
}
}
// Nyan型のクラスを拡張するためのデコレーター
// コンストラクタの引数にNyanを取って、
// そのクラスのnyanメソッドを拡張する
class NyanDecorator(decoratee: Nyan) extends Nyan {
def nyan(arg: String): String = {
val decoratedArg = arg + "なのです"
decoratee.nyan(decoratedArg)
}
}
// Nyan というインターフェイスに依存していて、
// 具体的なクラスには依存していない。
// ここには 生のNyanImpl が入ってくるかもしれないし、
// Decoratorに包まれたやつが入ってくるかもしれない。
// つまり、渡すnyanをいろいろ変えることによって、
// NyanUserの振る舞いを後から柔軟に変えることができる
class NyanUser(nyan: Nyan) {
def sayHooWithNyan = {
val nyanized = nyan.nyan("hoo")
println(nyanized)// hoo にゃーん or hoo なのですにゃーん
}
}
object DecoratorSample extends App{
// nyanUserに nyan を与えてもよし
val nyan:Nyan = new NyanImpl
val nyanUserA = new NyanUser(nyan)
nyanUserA.sayHooWithNyan; // hooにゃーん
// nyanUserに nyanWithDecorator を与えてもよし
val nyanWithDecorator: Nyan = new NyanDecorator(new NyanImpl) // NyanDecorator でNyanImpl をwrapする
val nyanUserB = new NyanUser(nyanWithDecorator)
nyanUserB.sayHooWithNyan; // hooなのですにゃーん
// いくらでもwrapできるので多段に振る舞いを変えられる
val nyanWithDecoratorWithDecorator: Nyan = new NyanDecorator(new NyanDecorator(new NyanImpl))
val nyanUserC = new NyanUser(nyanWithDecorator)
nyanUserC.sayHooWithNyan; // hooなのですなのですにゃーん
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment