【デザインパターン】RubyのComposite
code:ruby
irb(main):105:0> tree.add(branch1)
=>
@children=
[#<Composite:0x0000000100a72870
@children=
[#<Leaf:0x0000000100c555e8 @parent=#<Composite:0x0000000100a72870 ...>>,
@parent=#<Composite:0x0000000100b405e0 ...>>]>
irb(main):106:0> tree.add(branch2)
=>
@children=
[#<Composite:0x0000000100a72870
@children=
[#<Leaf:0x0000000100c555e8 @parent=#<Composite:0x0000000100a72870 ...>>,
@parent=#<Composite:0x0000000100b405e0 ...>>,
@parent=#<Composite:0x0000000100b405e0 ...>>]>
・末端は必ずleaf、子のあるオブジェクトはCompositeになる
code:ruby
irb(main):110:0> branch3 = Composite.new
irb(main):111:0> branch3.add(Leaf.new)
=>
irb(main):112:0> branch1.add(branch3)
=>
@children=
[#<Leaf:0x0000000100c555e8 @parent=#<Composite:0x0000000100a72870 ...>>,
@parent=#<Composite:0x0000000100a72870 ...>>],
@parent=
@children=
[#<Composite:0x0000000100a72870 ...>,
@parent=#<Composite:0x0000000100b405e0 ...>>,
irb(main):113:0> client_code(tree)
RESULT: Branch(Branch(Leaf+Leaf+Branch(Leaf))+Branch(Leaf)+Leaf)
・最初同じ階層のものは同じオブジェクトになるかと思ったけど上記の例は違う
・Componentのオブジェクトに対してはaddとかremoveとかできない
code:markdown
tree (root)
├── branch1
│ ├── Leaf (最初からあった)
│ ├── Leaf (最初からあった)
│ └── branch3 (新しく追加)
│ └── Leaf
├── branch2
│ └── Leaf
└── Leaf (rootの直下)