カテゴリー別アーカイブ: Decorator

デコレータパターン

デコレータパターンとは, 既存のオブジェクトに変更をすることなく, 新しい機能を追加することです.

代表的な実装例としては, Javaのストリームですね.

InputStream input    = new FileInputStream("input.txt");
OutputStream input = new FileOutputStream("output.txt");

これを, InputStreamReader / OutputStreamWriterでデコレートすることで, バイトストリームを文字ストリームに変換するという機能が追加できます.

Reader input  = new InputStreamReader(new FileInputStream("input.txt"));
Writer output = new OutputStreamWriter(new FileOutputStream("output.txt"));

さらに, さらに, BufferedReader / BufferedWriterでデコレートすることで, バッファリングという機能が追加できます.

Reader input  = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));
Writer output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt")));

JavaScriptの場合, プロトタイプ継承 (インスタンスの継承) という動的な継承関係をもてることから, デコレータパターンとは非常に相性が良いです.

さらに, 言えばjQueryではデコレータを実現するためのメソッドがあります.

//再帰的にデコレートするために, 第1引数にはtrueを指定する.
//デコレートした新規オブジェクトを返すために, 第2引数には空のオブジェクトを指定する.
var settings = $.extend(true, {}, defaults, options);

jQueryプラグインの実装では, イディオムのようなコードですね.

Java バイトストリームから文字ストリームへの変換

Androidアプリの作成では, ファイル (ストリーム) 処理をあつかう機会がなかったので, ちょっとしたサンプルコードを作成してみました.

変換のためには, InputStreamReader / OutputStreamWriterを利用します. これらは, 文字ストリームの抽象基底クラスであるReader / Writerを継承しています.

Javaのストリームを学ぶことはデコレータパターンの好例を学ぶことでもあります.