3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【プログラミング48(/2 -1)手】Composite

Posted at

ポイント

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?