说明:处理部分和整体的关系,整体是由部分组成,而部分又可以由更小的部分组成,这里更小的不能被细分的部分叫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