AspectJ を使ったデザインパターンの改善と支援 >
Decorator

最終更新日 : 2003/8/28 (2002/9/26 より)
asato <asato@ncfreak.com>

注意書き

かなり複雑かつ、実用的でない雰囲気が漂っています。どなたかもっと簡潔に書ける方法に気づいた方は、教えてもらえると嬉しいです。

追記 (2003/3/14): 久しぶりに更新しようと思ってコードを見ていたら、なぜ「オブジェクト Decorator」と「オブジェクトの同一性を意識した Decorator の実装」の二つがあるのかの理由を忘れてしまいました。何か違いがあったはずなんですが・・・

テスト環境

Decorator パターン

オブジェクトに責任を動的に追加する。Decorator パターンは、サブクラス化よりも柔軟な拡張方法を提供する。

GoF Decorator パターン

構成要素

AspectJ を使った Decorator パターンの実装

実装上の疑問と考慮

Decorator パターンを AspectJ を使ってなんらかの実装を行おうとする場合、いくつかの疑問が現れます:

なぜ再実装しようとするのか?

回答の1つは、好奇心のためです。AspectJ は Java プログラマにとっての新しい武器の1つかもしれません。AspectJ を使って Decorator パターンの実装しようとする場合、どのような壁にぶち当たるのでしょうか? どうやって実装していけば良いのでしょうか? どの方向に進めていけば良いのでしょうか? AspectJ の文法や使い方は、慣れるまでは大変です。読むのすら大変です。どう書けば良いのかさえ試行錯誤かもしれません。

つまり、(少なくとも著者にとっては) あらかじめどのような結果になるかを予測することは、やや困難なわけです。実際にやってみないと分からない、という状況が少なくありません。従って、最終的にどのような結果になるのか? を知りたい、というのが回答です。

もう1つの回答は、オリジナルの Decorator パターンが少なくとも1つの欠点 (装飾前のオブジェクトと装飾後のオブジェクトは同一でない) を持っているためです。AspectJ を使ってその欠点が克服できるかもしれません。

どこまで特徴を保つのか?

この質問は、AspectJ を使っての Decorator パターンの実装の方向や度合いに影響します。

Decorator パターンを実装できているのか?

Decorator パターンかどうかにこだわる必要があるのか?

テクニックの種類


確か、下の二つのテクニックは微妙に異なる実装上の目標を持っていたはず (なので別々のテクニックとして紹介している) ですが、具体的にそれが何だったのかは忘れてしまいました。もしかすると、同じものかもしれません。

実装上の目標

下の二つのテクニックともに、基本的な実装上の目標は component オブジェクトを装飾した後でも、オブジェクトの同一性を保つことです。

component オブジェクトを使う側から見た場合、装飾される前の component オブジェクトと装飾後の component オブジェクトが同一でないという結果は、GoF の Decorator パターンでの欠点の 1 つとして考えられています [GoF, p.190]:

Component comp1 = new ConcreteComponent();
Component comp2 = new ConcreteDecorator(comp1);

System.out.println(comp1 == comp2); // false
オブジェクトの同一性を保ちつつ、動的にオブジェクトの振る舞いを変更できる特徴に加え、下の二つのテクニックでは Decorator パターンのもう 1 つの特徴についても満たしています: 複数回の装飾。

Decorator パターンでは ConcreteDecorator クラスは ConcreteComponent クラスと Decorator クラス間の共通のクラスである Component クラスを継承しているため、特定の concrete decorator オブジェクトは component オブジェクトとしても扱えます:

Component comp1 = new ConcreteComponent();
Component comp2 = new ConcreteDecoratorA(comp1);
Component comp3 = new ConcreteDecoratorB(comp2);

静的 Decorator

別ページ。こちら

一度限りの Decorator

別ページ。こちら

オブジェクト Decorator

別ページ。こちら

オブジェクトの同一性を意識した Decorator の実装

別ページ。こちら

実装ノート

参考文献とリソース

更新履歴

todo

[
戻る ]