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