我正在尝试使用menu
实施Composite Pattern
,类似于here所描述的内容。
Component
声明Composite
和Leaf
共有几个函数作为纯虚函数。那里的实施没有问题。
因为我的"Client"
类需要访问仅在Composite
中使用的所有非常见函数(addChild,getChild,setSelectedItemNumber等...),我需要移动他们进入Component
。这会导致问题。如果我做对了,我必须将它们声明为纯虚拟,但是我需要在Leaf
中执行那些没有任何意义的实现。
另一种可能的解决方案可能是在Component
中执行这些功能。但后来我最终在Component
和Composite
之间建立了紧密耦合,因为它们需要相互指向一个指针。另外我不确定在界面中是否有这个指针是个好主意。
我认为这两种解决方案都很糟糕,所以我希望有人可以指出我做正确的方法。有什么建议?提前谢谢!
所以这是我的代码。我有一个类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_;
};
答案 0 :(得分:0)
如果您的&#34;客户&#34;需要有权访问复合,它应该将(智能)指针或引用保存到Menu
。而不是MenuComponent
。
你在这里误解了MenuComponent
的目的。它不是客户端操作整个菜单功能的抽象界面,它是在菜单结构上操作的界面。
因此,GoF将其列为&#34;结构模式&#34;他们的一部分。