[gruby-list:0007] gRubyについて(3)

Back to archive index

Yuya Kato yuya****@katod*****
2004年 2月 6日 (金) 15:04:50 JST


Yuyaです。

 次に「Decorator」について解説します。
Decoratorもその名の通り、GoFのDecoratorパターンを利用している
クラス群です。

* BorderDecorator
* PaddingDecorator
* ShadowDecorator

などのクラスがあります。

Decoratorクラスは、描画位置の計算と実際の描画処理を行います。
一言で言えば「自分自身と子オブジェクトを描画」します。
描画すると言っても、背景や枠、影などです。チャートの描画処理
はChartクラスが行います。

Decoratorオブジェクトは0個以上の子オブジェクトを持ちます。
もっとも多いのが、1個の子オブジェクトを持つDecoratorです。

簡単な例として、下記のような3つのDecoratorオブジェクトの
連鎖を見てみましょう。

+----------------+   +----------------+   +---------------+
|PictureDecorator|-->|PaddingDecorator|-->|BorderDecorator|
+----------------+   +----------------+   +---------------+

PictureDecoratorは背景を描画するDecorator、PaddingDecorator
は空白を描画する(実際にはなにも描画しない)Decorator、
BorderDecoratorは枠を描画するDecoratorです。
上記の図は:

+----------------+   +----------------+
| 親オブジェクト |-->| 子オブジェクト |
+----------------+   +----------------+

という感じになっています。

すべてのDecoratorクラスはdrawというインスタンスメソッドを
持っており、このメソッドは描画対象のイメージオブジェクトと
描画領域を引数として取ります。

最初にPictureDecoratorオブジェクトのdrawメソッドを呼びます。
その際に、描画対象イメージオブジェクトと、描画対象の領域
の座標を渡します。例えば、(10,10)-(90,90)のような感じで
描画領域矩形の開始座標と終了座標を渡します。

PictureDecoratorオブジェクトは描画対象イメージオブジェクトの
描画領域に、背景イメージを描画します。
そして次に、PictureDecoratorオブジェクトの子オブジェクトである
PaddingDecoratorオブジェクトのdrawメソッドを呼びます。
描画対象イメージオブジェクトと描画領域はそのまま渡します。

PaddingDecoratorオブジェクトは何も描画せずに、子オブジェクト
であるBorderDecoratorオブジェクトのdrawメソッドを呼びます。
しかしこの際に、描画対象イメージオブジェクトはそのまま渡し
ますが、描画領域は縮小して渡します。例えば10ピクセル分。
(10,10)-(90,90)は(20,20)-(80,80)と言った感じに。

最後に、BorderDecoratorオブジェクトは描画対象イメージオブジェクト
の描画領域に枠を描画して終わりです。
最終的には、最初に指定した描画領域に背景が描画され、それから
10ピクセル内側に縮小した場所に枠が描画されます。
分かりにくい説明かも知れませんが、これがDecoratorオブジェクトの
基本動作です。
様々なDecoratorオブジェクトを連鎖させることによって、複雑な
描画が行えます。

(やっぱり上手く説明できないけど続く、、、)

====== Yuya Kato ======
E-Mail yuya****@katod*****
   Web http://nuance.cc/
i-mode http://nuance.cc/i/




gruby-list メーリングリストの案内
Back to archive index