2010年6月13日日曜日

Compositeパターン

Compositeとは「合成する」とか「混ぜる」という意味ですが、Compositeパターンはファイルとディレクトリ構造のように容器とその中身を同じものとして扱い、再帰的な構造を作るパターンになります。

ファイルとディレクトリの例でいいますと、

Entryクラス
  • FileクラスとDirectoryクラス共通の親クラス(abstract)
  • FileとDirectory共通のメソッドはここでabstractで定義
  • Entryをaddするaddメソッドも用意するが、使用できるのはDirectoryのみなので、Entryクラス上では「何も実行しない」又は「例外を投げる」にしておく(ちなみに、addメソッドをabstractにすると、Fileクラスでaddメソッドを実装するハメになるので、abstractにしない)
Fileクラス
  • ファイルを表すクラス
  • 管理するのは名前とファイルとファイルサイズくらい?
Directoryクラス
  • ディレクトリを表すクラス
  • 名前とそのディレクトリが保持しているEntryのリストを管理
  • 必ずaddメソッドを実装
です。

ファイル(ディレクトリ)パスを表示したいときは、Entryクラスにabstractなprintメソッドを用意し、各クラスの実装においては、
  • Fileクラス:ファイル名を表示
  • Directoryクラス:自信のディレクトリ名だけでなく、リストから一つずつEntryを取り出し、それのprintメソッドを呼ぶ(Compositeが再帰的なので、このメソッドも再帰的に定義出来る)
と言う風にしておけばいいでしょう。


すみません、サンプルソースは本の丸写しになりそうなのでやめておきます(´・ω・`)
ファイル、ディレクトリ以外でCompositeになるものがあればいいのですが・・・


関連パターン
「Commandパターン」(勉強中)
「Visitorパターン」(勉強中)
Decoratorパターン」中身と容器を同じ扱いにするのがCompositeパターンで、中身と飾りを同じ扱いにするのがDecoratorパターン


0 件のコメント:

コメントを投稿