Составной объект
От: fryme  
Дата: 08.04.11 09:12
Оценка:
Никак не получается гармонично описать достаточно простой интерфейс.
Суть такая: есть некая сущность, которая выполняет задания (Task). Задания могут быть разных типов, всего предположим, что 5 типов заданий (SuperTask, PuperTask etc.) у каждого своя специфика, свои методы исполнения и т.п. Я сделал базовый класс Task и от него просто пронаследовал все эти специфические типы заданий, просто переопределив в каждом метод run() по-своему.
У всех заданий есть общие характеристики, параметры и прочее, которые хранятся в БД. В какой то момент задания грузятся из БД, динамически по полю типа (поле в БД) определяется что за задание и заполняется массив вроде: tasks.push_back( TaskFactory::create ( sqlResult.type)).
Затем сущность, которая управляет всеми этими задачами начинает их исполнять: tasks.last()->run().
До этого момента всё понятно.

Но встал вопрос, что нужно сделать сделать некий тип задачи, данные для которого всё так же берутся из БД, но при этом он получается как бы составной (CompositeTask), т.е. в его методе run() нужно будет использовать разные другие методы других заданий. Поясню:

class Task {
    public:
        // Метод запускающий выполнение задачи
        virtual void run() = 0;
        
        // Данные из БД лежат тут
        struct _DBStructure {
            ...
            std::string field;
            ...
        } DBStructure;
};


class SuperTask : public Task {
    public:
        // У каджого своё
        void run() { 
            //
        }
};

class PuperTask : public Task {
    public:
        // У каджого своё
        void run() {
        }
};


class CompositeTask : public Task {
    public:
        void run() {
            SuperTask sTask;
            sTask.DBStructure.field = DBStructure.field;
            sTask.run();
            
            PuperTask pTask;
            pTask.DBStructure.field = DBStructure.field;
            pTask.run();
            
            SuperTask sTask2;
            sTask2.DBStructure.field = DBStructure.field;
            sTask2.run();
            
            // и тд последовательность из много разных методов
        }
};




Вот не понимаю как организовать структуру так, чтобы было так сказать красиво. Момент с копированием полей из CompositeTask.DBStructure мне кажутся очень кривым. Кто прочитал и понял о чём речь может посоветовать что то по делу?
Заранее спасибо!
c++
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.