Composite pattern - Design Pattern in Ruby Chapter 6
共通のオペレーションを行う要素と、その要素の集合体を同じように扱うことで、複雑な構造をシンプルに扱う。
用語
Component 共通のインターフェース
Leaf ミニマムの要素
Composite 要素の集合体
注意点
compositeとleaf,異なる属性のものを全く同じように扱うのは無理。
目的に沿って、うまく設計する必要がある。
実践
ViewCompnentをサイズを共通オペレーションとして持つような想定で実装.
class ViewComponent attr_accessor :name, :position def initialize(name, position) @name = name @position = position end def get_size { width: 0, height: 0 } end end class Element < ViewComponent def get_size { width: 50, height: 100 } end end class ViewContainer < ViewComponent def initialize(name, position) super(name, position) @children = [] end def add_child(child) @children << child end def get_size width = 0 height = 0 @children.each do |child| w = child.position[:x] + child.get_size[:width] h = child.position[:y] + child.get_size[:height] width = w if w > width height = h if h > height end { width: width, height: height } end end box = ViewContainer.new 'Box', {x: 10, y: 10} box.add_child Element.new 'ele1', {x:20, y: 20} p box.get_size # {:width=>70, :height=>120} box.add_child Element.new 'ele2', {x:100, y: 200} p box.get_size #{:width=>150, :height=>300}