「Rubyによるデザインパターン」の読書メモです。
時々、個人の見解入りです。
「全体が部分のように振る舞う」という状況を表すデザインパターン
コンポジットオブジェクトの役割
1つにコンポジットオブジェクトはコンポーネントとしての役割を持っています。その一方で、コンポジットオブジェクトはコンポーネントのコレクションとしての役割も持っています。
例
class Task
attr_reader :name
def initialize(name)
@name = name
end
def get_time_required
0.0
end
end
class CompositeTask < Task
def initialize(name)
super(name)
@sub_tasks = []
end
def add_sub_task(task)
@sub_tasks << task
end
def remove_sub_task(task)
@sub_tasks.delete(task)
end
def get_time_required
time = 0.0
@sub_tasks.each {|task| time += task.get_time_required}
time
end
end
class AddDryIngredientsTask < Task
def initialize
super('Add dry ingredients')
end
def get_time_required
1.0
end
end
class MixTask < Task
def initialize
super('Mix that better up!')
end
def get_time_required
3.0
end
end
class MakeBatterTask < CompositeTask
def initialize
super('Make batter')
@sub_tasks = []
add_sub_task(AddDryIngredientsTask.new)
add_sub_task(MixTask.new)
end
end
p MakeBatterTask.new.get_time_required
演算子を実装したバージョン
class Task
attr_reader :name
def initialize(name)
@name = name
end
def get_time_required
0.0
end
end
class CompositeTask < Task
def initialize(name)
super(name)
@sub_tasks = []
end
def <<(task)
@sub_tasks << task
end
def [](index)
@sub_tasks[index]
end
def []=(index, value)
@sub_tasks[index] = value
end
def remove_sub_task(task)
@sub_tasks.delete(task)
end
def get_time_required
time = 0.0
@sub_tasks.each {|task| time += task.get_time_required}
time
end
end
class AddDryIngredientsTask < Task
def initialize
super('Add dry ingredients')
end
def get_time_required
1.0
end
end
class MixTask < Task
def initialize
super('Mix that better up!')
end
def get_time_required
3.0
end
end
class MakeBatterTask < CompositeTask
def initialize
super('Make batter')
@sub_tasks = []
@sub_tasks << AddDryIngredientsTask.new
@sub_tasks << MixTask.new
end
end
p MakeBatterTask.new.get_time_required