Design Patterns Ruby

class Job
  attr_reader :name
  def initialize(name)
    @name = name
  end
  def get_time_required
    0.0
  end
end
class SubJob1 < Job
  def initialize
    super('sub job 1')
  end
  def get_time_required
    1.0             # 1 minute to add flour and sugar
  end
end
class SubJob2 < Job
  def initialize
    super('sub job 2')
  end
  def get_time_required
    3.0             # Mix for 3 minutes
  end
end
class CompositeJob < Job
  def initialize(name)
    super(name)
    @sub_jobs = []
  end
  def add_sub_job(job)
    @sub_jobs << job
  end
  def remove_sub_job(job)
    @sub_jobs.delete(job)
  end
  def get_time_required
    time=0.0
    @sub_jobs.each {|job| time += job.get_time_required}
    time
  end
end
class MakeCakeJob < CompositeJob
  def initialize
    super('Make cake')
    add_sub_job( SubJob1.new )
    add_sub_job( SubJob2.new )
  end
end