Compositeパターン Ruby
Compositeパターン
コンポジットパターンとは
- あるものが同じような下位のもので作られているという考え方
- 大きなオブジェクトが小さな子オブジェクトから構成されていて、その子オブジェクトもさらに小さな孫オブジェクトでできていたりする
- 階層構造やツリー構造のオブジェクトを作りたい時に利用出来る
構成
- コンポーネント(Component):すべてのオブジェクトの基底となるクラス
- リーフ(Leaf):プロセスの単純な構成要素、再帰しない
- コンポジット(Composite):コンポーネントの1つでサブコンポーネントで構成
「再帰」とは、ある処理の中で再びその手続きを呼び出すこと。
用いるメリット
# FileEntry, DirEntryクラスの共通メソッドを規定(Component) class Entry # ファイル/ディレクトリの名称を返す def get_name; end # ファイル/ディレクトリのパスを返す def ls_entry(prefix) end # ファイル/ディレクトリの削除を行う def remove; end end # Leaf (中身) 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 # Composite 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 root = DirEntry.new("root") tmp = DirEntry.new("tmp") tmp.add(FileEntry.new("conf")) tmp.add(FileEntry.new("data")) root.add(tmp) root.ls_entry("") #/root #/root/tmp #/root/tmp/conf #/root/tmp/data root.remove #confを削除しました #dataを削除しました #tmpを削除しました #rootを削除しました