ポイント
Composite(合成)パターン。
例えば、ディレクトリとファイルなどのような、木構造を伴う再帰的なデータ構造を表すときに用いられるようなパターン。
サンプルコード
以下サイトと同じコード。
http://morizyun.github.io/blog/ruby-design-pattern-04-composite/
Composite.rb
class Entry
def get_name
end
def ls_entry(prefix)
end
def remove
end
end
class FileEntry < Entry
def initialize(name)
@name = name
end
def get_name
@name
end
def ls_entry(prefix)
puts(prefix + "/" + get_name)
end
def remove
puts @name + "を削除しました。"
end
end
class DirEntry < Entry
def initialize(name)
@name = name
@directory = Array.new
end
def get_name
@name
end
def add(entry)
@directory.push(entry)
end
def ls_entry(prefix)
puts(prefix + "/" + get_name)
@directory.each do |e|
e.ls_entry(prefix + "/" + @name)
end
end
def remove
@directory.each do |i|
i.remove
end
puts @name + "を削除しました。"
end
end
tmp = DirEntry.new("tmp")
tmp.add(FileEntry.new("conf.html"))
tmp.add(FileEntry.new("data.html"))
root = DirEntry.new("root")
root.add(tmp)
root.ls_entry("")
root.remove
- 枝:DirEntryクラス
- 葉:FileEntryクラス
所感
- 再帰処理などをシンプルに書けそう。
参考
http://morizyun.github.io/blog/ruby-design-pattern-04-composite/
http://www.nulab.co.jp/designPatterns/designPatterns2/designPatterns2-4.html