模式特点
将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式让客户端可以统一地处理单个对象和组合对象。
- 树形结构中叶节点和组合节点实现同一接口
- 客户端无需区分简单元素和复合元素
- 方便地添加新的组件类型
类图
应用场景
- Qt 中 QObject 的父子对象树管理
- UI 控件树:窗口包含面板,面板包含按钮等
- 文件系统:目录和文件的统一操作
- Qt Scene Graph:QGraphicsItem 的父子层次
- 组织架构管理:公司-部门-员工树形结构
示例代码(C++)
class UIComponent { public: virtual void render(int depth = 0) = 0; virtual void add(UIComponent*) {} // 默认空实现 virtual ~UIComponent() = default; }; // 叶节点 class Button : public UIComponent { std::string label; public: Button(const std::string& l) : label(l) {} void render(int depth) override { std::cout << std::string(depth, ' ') << "[Button] " << label << std::endl; } }; // 组合节点 class Panel : public UIComponent { std::vector<UIComponent*> m_children; std::string name; public: Panel(const std::string& n) : name(n) {} void add(UIComponent* c) override { m_children.push_back(c); } void render(int depth) override { std::cout << std::string(depth, ' ') << "+ Panel: " << name << std::endl; for (auto* c : m_children) c->render(depth + 2); } }; // 使用:统一操作叶节点和组合节点 Panel* mainPanel = new Panel("主面板"); mainPanel->add(new Button("确定")); Panel* subPanel = new Panel("子面板"); subPanel->add(new Button("取消")); mainPanel->add(subPanel); mainPanel->render(); // 递归渲染整棵树