组合模式是一种结构型设计模式,它将对象组织成树形结构以表示“部分-整体”的层次结构,使客户端对单个对象和对象组合的使用具有一致性。
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
// 抽象组件
class Component {
public:
virtual void operation() const = 0;
virtual ~Component() = default;
};
// 叶子节点
class Leaf : public Component {
private:
string name;
public:
explicit Leaf(const string& name) : name(name) {}
void operation() const override {
cout << "Leaf: " << name << endl;
}
};
// 容器节点
class Composite : public Component {
private:
vector<shared_ptr<Component>> children;
public:
void add(const shared_ptr<Component>& component) {
children.push_back(component);
}
void remove(const shared_ptr<Component>& component) {
children.erase(remove(children.begin(), children.end(), component), children.end());
}
void operation() const override {
cout << "Composite contains:" << endl;
for (const auto& child : children) {
child->operation();
}
}
};
// 客户端代码
int main() {
auto leaf1 = make_shared<Leaf>("Leaf 1");
auto leaf2 = make_shared<Leaf>("Leaf 2");
auto composite = make_shared<Composite>();
composite->add(leaf1);
composite->add(leaf2);
composite->operation();
return 0;
}
using System;
using System.Collections.Generic;
// 抽象组件
public abstract class Component {
public abstract void Operation();
}
// 叶子节点
public class Leaf : Component {
private string name;
public Leaf(string name) {
this.name = name;
}
public override void Operation() {
Console.WriteLine($"Leaf: {name}");
}
}
// 容器节点
public class Composite : Component {
private readonly List<Component> children = new List<Component>();
public void Add(Component component) {
children.Add(component);
}
public void Remove(Component component) {
children.Remove(component);
}
public override void Operation() {
Console.WriteLine("Composite contains:");
foreach (var child in children) {
child.Operation();
}
}
}
// 客户端代码
class Program {
static void Main() {
var leaf1 = new Leaf("Leaf 1");
var leaf2 = new Leaf("Leaf 2");
var composite = new Composite();
composite.Add(leaf1);
composite.Add(leaf2);
composite.Operation();
}
}
特性 | 叶子节点(Leaf) | 容器节点(Composite) |
---|---|---|
是否包含子节点 | 否 | 是 |
操作方式 | 实现具体功能 | 管理子节点并实现功能 |
典型场景 | 文件、图形基本形状等 | 文件夹、组合图形等 |
设计复杂性 | 简单 | 较复杂 |
组合模式通过分层和组合,极大地提高了系统处理树形结构的能力,同时也对客户端代码的实现进行了很好的封装和抽象。
欢迎关注、点赞、收藏!更多系列内容可以点击专栏目录订阅,感谢支持,再次祝大家祉猷并茂,顺遂无虞!
若将文章用作它处,请一定注明出处,商用请私信联系我!