##概要
木構造の再帰的なデータを表現するためのパターン
以下の4種類のクラスからなる
- Componentクラス(枝と葉に共通するインターフェイス、親、子へのアクセスを宣言し、適宜実装する)
- Leafクラス(階層構造の末端の葉オブジェクトを表し、振る舞いを定義する)
- Compositeクラス(枝オブジェクトの振る舞いを定義し、1.で宣言された子オブジェクトに関するオペレーションを実装する)
- Clientクラス(1.のインターフェイスを通して、枝や葉オブジェクトを操作する)
##具体例と実装
ファイルとディレクトリからなる木構造を例にすると
上記1~4はそれぞれ
- ディレクトリエントリークラス
- ファイルクラス
- ディレクトリクラス
- クライアントクラス
が対応する。
コードの詳細は以下
directory_entry.rb
class DirectoryEntry
def get_name
end
def remove
end
end
file.rb
class File < DirectoryEntry
def initialize(name)
@name = name
end
def get_name
@name
end
def remove
# ファイルを削除
end
end
directory.rb
class Directory < DirectoryEntry
def initialize(name)
@name = name
@children = []
end
def get_name
@name
end
def remove
@children.each do |item|
item.remove
end
# ディレクトリ自身を削除
end
def add(item)
@children << item
end
end
##メリット
- クライアントは、木構造内のすべてのオブジェクトを一様に扱うことが出来る
- 新しく定義されたCompositeクラス、Leafクラスは既存の構造に自動的に取り込むことができる
##まとめ
木構造を構成するオブジェクトを透過的に扱えるパターン。
循環のない再帰的な構造を表現する際に用いる。