坚持复合模式的实现 - ruby on rails
问题描述:
没有人有一个很好的端到端的例子来说明如何在GoF中保存一个文本书合成模式,比如下面的例子吗?坚持复合模式的实现 - ruby on rails
组件的基类:
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
答
你只需要坚持的属性数据库,如name
和time
(你可能要坚持它,而不是在运行时分配它)和sub_tasks
。你只为叶子任务做这个。您通常不会将每个复合任务持久化到数据库。
您可以使用STI(单表继承)来实现此模式。你可以创建一个基类Task < ActiveRecord::Base
(假设Rails4)。然后你从这里继承LeafTask
和CompositTask
。然后你可以坚持你拥有的每一项任务作为任何一个任务的实例。如果您的任务需要非常不同的接口,那么您可能需要对它们中的每一个进行子类化。如果他们每个人甚至需要非常不同的属性,那么你可能会考虑多重继承(即他们仍然从Task
继承,但他们使用自己的表)。
谢谢。你将如何坚持由CompositeTask创建的关系? – rg1176
更新了我的答案 – EJ2015