# Visitor パターン # # Fileクラスはシステムで定義してあるのでFile以外のクラス名とすること # # 印字内容は検討中 # class Filenode def initialize(name, size) @name = name @size = size end def visit puts "File : " + @name + " size " + @size.to_s + " byte" end end class Directorynode @@currentdir = "" def initialize(name) @name = name @list = Array.new end def add(entry) @list.push(entry) end def name @name end def visit puts @@currentdir + "/" + @name + " " savedir = @@currentdir @@currentdir = @@currentdir + "/" + @name @list.each {|item| item.visit} @@currentdir = savedir end end f1 = Filenode.new("F1", 128) d1 = Directorynode.new("D1") f2 = Filenode.new("F2", 256) d2 = Directorynode.new("D2") f3 = Filenode.new("F3", 64) d3 = Directorynode.new("D3") f4 = Filenode.new("F4",1024) f5 = Filenode.new("F5", 256) d1.add(f1) d1.add(d2) d1.add(f2) d2.add(f3) d2.add(f4) d2.add(d3) d3.add(f5) d1.visit # Filenode や Directornode にvisitを書きたくないならばどうするか # class Visitorとして分離できるか?