如何使用复合模式实现菜单?

时间:2016-09-05 13:08:47

标签: c++ menu composite

我正在尝试使用menu实施Composite Pattern,类似于here所描述的内容。

Component声明CompositeLeaf共有几个函数作为纯虚函数。那里的实施没有问题。

因为我的"Client"类需要访问仅在Composite中使用的所有非常见函数(addChild,getChild,setSelectedItemNumber等...),我需要移动他们进入Component。这会导致问题。如果我做对了,我必须将它们声明为纯虚拟,但是我需要在Leaf中执行那些没有任何意义的实现。

另一种可能的解决方案可能是在Component中执行这些功能。但后来我最终在ComponentComposite之间建立了紧密耦合,因为它们需要相互指向一个指针。另外我不确定在界面中是否有这个指针是个好主意。

我认为这两种解决方案都很糟糕,所以我希望有人可以指出我做正确的方法。有什么建议?提前谢谢!

所以这是我的代码。我有一个类MenuComponent,它是Component(接口):

class MenuComponent
{
public:
    virtual ~MenuComponent() { };

    // placeholder for some pure virtual functions
    virtual MenuComponent* getChild(int position) const;
    virtual void addChild(MenuComponent* child);
    virtual int getSelectedItemNumber() const;
    virtual void setSelectedItemNumber(const int& selectedItemNumber);
    virtual int getNumberOfMenuItems() const;
};  

类菜单,即Composite

class Menu : public MenuComponent
{

public:
    Menu(Menu* parent, int menuType, int selectedItemNumber, int numberOfMenuItems, int menuId);

    // placeholder for declaration of the pure virtual functions from the interface
    MenuComponent* getChild(int position) const;
    void addChild(MenuComponent* menu);
    int getSelectedItemNumber() const;
    void setSelectedItemNumber(const int& selectedItemNumber);
    int getNumberOfMenuItems() const;

private:
    // placeholder for member variables for the implementation of the pure virtual functions
    int selectedItemNumber_;
    int numberOfMenuItems_;

    std::vector<MenuComponent*> childs_;
};

当然是一个类MenuItem,它是Leaf

class MenuItem : public MenuComponent
{

public:
    MenuItem(Menu* parent, int menuType, int menuId);

    // placeholder for declaration of the pure virtual functions from the interface
    int getActiveItem() const;
    void setActiveItem(const int activeItem);   

private:
    // placeholder for member variables for the implementation of the pure virtual 
    int activeItem_;
};  

1 个答案:

答案 0 :(得分:0)

如果您的&#34;客户&#34;需要有权访问复合,它应该将(智能)指针或引用保存到Menu。而不是MenuComponent

你在这里误解了MenuComponent的目的。它不是客户端操作整个菜单功能的抽象界面,它是在菜单结构上操作的界面。

因此,GoF将其列为&#34;结构模式&#34;他们的一部分。