ファイルとディレクトリの例でいいますと、
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 件のコメント:
コメントを投稿