说明:处理部分和整体的关系,整体是由部分组成,而部分又可以由更小的部分组成,这里更小的不能被细分的部分叫leaf, 整体被称为componet, 而中间部分同时组成整体又被更小的部分组成的成分叫做composite

#这里是最小部分,中间部分,整体的直观代码实现
#说明:Task是基类,AddDryIngredientsTask和MixTask是leaf, MakeBatterTask是composite
class Task
  attr_reader :name

  def initialize name
    @name = name
  end

  def get_time_required
    0.0
  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 batter up'
  end

  def get_time_required
    3.0
  end
end

class MakeBatterTask < Task

  def initialize
    super 'Make batter'
    @sub_tasks = []
    add_sub_task AddDryIngredientsTask.new
    add_sub_task MixTask.new
  end

  def add_sub_task task
    @sub_tasks << task
  end

  def remove_sub_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

在composite模式中,是把中间部分抽象出来形成一个composite,其中的代码作用是用来组合各种leaf, 主要的方法包括增加和减少leaf以及实现共同的接口方法,比如上面的gettimerequired方法, 中间类通过继承composite的方式来进行生成类。

#具体实现
class CompositeTask < Task
  def initialize name
    super name
    @sub_tasks = []
  end

  def add_sub_task task
    @sub_tasks << task
  end
  def remove_sub_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 MakeBatterTask < CompositeTask
  def initialize
    super 'Make batter'
    add_sub_task AddDryIngredientsTask.new
    add_sub_task MixTask.new
  end
end

http://www.cnblogs.com/nbkhic/archive/2011/07/26/2117566.html

results matching ""

    No results matching ""