2017-09-20 12 views
1

누구나 아래처럼 GoF에서 텍스트 북 합성 패턴을 데이터베이스에 유지하는 방법에 대한 완벽한 엔드 투 엔드 예제가 있습니까?복합 패턴 구현 - 레일상의 루비 유지

구성 요소의 기본 클래스 :

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 

답변

0
당신은 그러한 nametime로 (당신은 아마 그것을 유지하는 대신하려는 속성이 dB로 유지해야

런타임에 할당) 및 sub_tasks. 그리고 리프 작업을 위해서만이 작업을 수행합니다. 대개 모든 복합 작업을 DB에 유지하지 않습니다.

STI (단일 테이블 상속)를 사용하여이 패턴을 실현할 수 있습니다. 하나의 기본 클래스 Task < ActiveRecord::Base (Rails4를 가정)을 만들 수 있습니다. 그런 다음 LeafTaskCompositTask을 서브 클래 싱합니다. 그런 다음 모든 작업을 둘 중 하나의 인스턴스로 유지할 수 있습니다. 당신의 작업이 매우 다른 인터페이스를 필요로한다면, 각각의 인터페이스를 서브 클래스화할 수 있습니다. 각각에 매우 다른 속성이 필요한 경우에도 다중 테이블 상속을 고려할 수 있습니다 (즉, 여전히 Task의 하위 클래스이지만 자체 테이블을 사용합니다).

+0

감사합니다. CompositeTask에 의해 생성 된 관계를 어떻게 지속시킬 것입니까? – rg1176

+0

업데이트 됨 – EJ2015