Last active
August 29, 2015 13:58
-
-
Save Shinpeim/10394992 to your computer and use it in GitHub Desktop.
もうちょっとよくした
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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