【デザインパターン】RubyのComposite
https://refactoring.guru/ja/design-patterns/composite/ruby/example
code:ruby
irb(main):105:0> tree.add(branch1)
=>
#<Composite:0x0000000100b405e0
@children=
[#<Composite:0x0000000100a72870
@children=
[#<Leaf:0x0000000100c555e8 @parent=#<Composite:0x0000000100a72870 ...>>,
#<Leaf:0x0000000100c05958 @parent=#<Composite:0x0000000100a72870 ...>>],
@parent=#<Composite:0x0000000100b405e0 ...>>]>
irb(main):106:0> tree.add(branch2)
=>
#<Composite:0x0000000100b405e0
@children=
[#<Composite:0x0000000100a72870
@children=
[#<Leaf:0x0000000100c555e8 @parent=#<Composite:0x0000000100a72870 ...>>,
#<Leaf:0x0000000100c05958 @parent=#<Composite:0x0000000100a72870 ...>>],
@parent=#<Composite:0x0000000100b405e0 ...>>,
#<Composite:0x0000000100962598
@children=#<Leaf:0x0000000100c97f88 @parent=#<Composite:0x0000000100962598 ...>>,
@parent=#<Composite:0x0000000100b405e0 ...>>]>
・末端は必ずleaf、子のあるオブジェクトはCompositeになる
code:ruby
irb(main):110:0> branch3 = Composite.new
=> #<Composite:0x0000000100b42db8 @children=[]>
irb(main):111:0> branch3.add(Leaf.new)
=>
#<Composite:0x0000000100b42db8
@children=#<Leaf:0x0000000100c7dc78 @parent=#<Composite:0x0000000100b42db8 ...>>>
irb(main):112:0> branch1.add(branch3)
=>
#<Composite:0x0000000100a72870
@children=
[#<Leaf:0x0000000100c555e8 @parent=#<Composite:0x0000000100a72870 ...>>,
#<Leaf:0x0000000100c05958 @parent=#<Composite:0x0000000100a72870 ...>>,
#<Composite:0x0000000100b42db8
@children=#<Leaf:0x0000000100c7dc78 @parent=#<Composite:0x0000000100b42db8 ...>>,
@parent=#<Composite:0x0000000100a72870 ...>>],
@parent=
#<Composite:0x0000000100b405e0
@children=
[#<Composite:0x0000000100a72870 ...>,
#<Composite:0x0000000100962598
@children=#<Leaf:0x0000000100c97f88 @parent=#<Composite:0x0000000100962598 ...>>,
@parent=#<Composite:0x0000000100b405e0 ...>>,
#<Leaf:0x0000000100b32f58 @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の直下)