坚持复合模式的实现 - 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 

你只需要坚持的属性数据库,如nametime(你可能要坚持它,而不是在运行时分配它)和sub_tasks。你只为叶子任务做这个。您通常不会将每个复合任务持久化到数据库。

您可以使用STI(单表继承)来实现此模式。你可以创建一个基类Task < ActiveRecord::Base(假设Rails4)。然后你从这里继承LeafTaskCompositTask。然后你可以坚持你拥有的每一项任务作为任何一个任务的实例。如果您的任务需要非常不同的接口,那么您可能需要对它们中的每一个进行子类化。如果他们每个人甚至需要非常不同的属性,那么你可能会考虑多重继承(即他们仍然从Task继承,但他们使用自己的表)。

+0

谢谢。你将如何坚持由CompositeTask创建的关系? – rg1176

+0

更新了我的答案 – EJ2015