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/