包含对象和容器的容器

时间:2011-05-05 13:57:56

标签: c++ oop qt design-patterns

我正在尝试创建一个将迭代的结构,并且从左到右依次绘制存储在其中的对象。但是会有容器存放在可绘制对象的旁边。这些容器我认为它们是绘图堆栈,其中可绘制对象彼此重叠绘制。我写了一些粗糙的伪代码,但是我无法想出一个通用接口来让我的容器和可绘制对象继承。我的目标是容器和可绘制对象之间的通用接口。我想我可以通过插入容器来实现它,即使它们内部只有一个可绘制对象,我觉得这只占用更多内存并降低速度。我也不想避免使用对象来获取正确的调用。有人可以建议我应该做什么,我不是最先进的程序员,但我确实努力提高速度和代码。这是我到目前为止(我知道一些接口调用与家属不匹配,我只是不知道该怎么做):

class IDrawable {
  protected:
    signal_t sig; // this is an enumeration
  public:
    void paint(QPainter &painter); // This functionality will be defined here since it is painting to a pixmap

    virtual void reset() = 0;
    virtual void init() = 0; // Setup code will go here
    virtual void update(float) = 0;
};

class Signal : public virtual IDrawable {
  private:
    bool state; // By default this will be false
  public:
    Signal();
    virtual ~Signal();
    // Parameters for update is 0 or 1, since the graphic is just toggled on or off
    virtual void update(float) = 0; // Drawing happens here. Will draw to pixmap
    bool state() {return state;}
};

class Gage : public virtual IDrawable {
  private:
    float cur_val;
  public:
    Gage();
    virtual ~Gage();
    virtual void init() = 0; // Setup code will go here
    virtual void update(float) = 0; // Drawing happens here. Will draw to pixmap
};

class TextGage : public virtual Gage {
  public:
    TextGage();
    virtual ~TextGage();
    void update(float); // Define update functionality here
};

// a stack can coexist with a Gage object in a container
class DrawableStack : public virtual IDrawable {
  private:
    QMap<signal_t, IDrawable*> *Stack;
  public:
    DrawableStack();
    virtual ~DrawableStack();

    void init() {
        Stack = new QMap<signal_t, IDrawable*>();
    }

    void update(signal_t,float); // Drawing happens here. Will draw to pixmap

    void setStack(QMap<IDrawable*> *gageStack) {
        Stack = gageStack;
    }

    void push(IDrawable* node) {
        Stack.insert(node->sigType, node);
    }
};

2 个答案:

答案 0 :(得分:4)

这是您需要应用的经典复合设计模式:

http://en.wikipedia.org/wiki/Composite_pattern

答案 1 :(得分:1)

我认为,你要找的是复合模式......