组合模式(Composite Pattern)

简介: 组合模式是一种结构型设计模式,将对象组织成树形结构,表示“部分-整体”的层次关系,使客户端可以一致地处理单个对象和组合对象。适用于文件系统、组织架构等场景,具有高灵活性和扩展性,但会增加系统复杂性。

组合模式(Composite Pattern)详解

定义

组合模式是一种结构型设计模式,它将对象组织成树形结构以表示“部分-整体”的层次结构,使客户端对单个对象和对象组合的使用具有一致性。


组合模式的结构

核心角色

  1. 抽象组件(Component)
    声明组合中对象的接口,定义了叶子节点和容器节点的共同行为。
  2. 叶子节点(Leaf)
    叶子对象表示树的叶节点,没有子节点,负责实现抽象组件的行为。
  3. 容器节点(Composite)
    容器对象包含子节点,负责实现管理子节点的操作(如添加、移除子节点),并实现抽象组件的行为。
  4. 客户端(Client)
    通过抽象组件与树形结构进行交互,不关心是单个对象还是组合结构。

组合模式的适用场景

  1. 需要表示树形结构的对象:如文件系统、组织架构、图形界面中的组件。
  2. 希望客户端可以一致地处理单个对象和组合对象:无论是单一对象还是组合结构,都以统一的方式对待。
  3. 避免繁琐的类型检查:通过抽象组件的统一接口,客户端不需要关注对象的具体类型。

组合模式的优缺点

优点

  1. 一致性:客户端可以一致地操作单个对象和组合对象,简化了代码。
  2. 灵活性:通过组合不同的对象,可以轻松构建复杂的树形结构。
  3. 扩展性:添加新的叶子节点或容器节点时无需修改现有代码。

缺点

  1. 复杂性增加:需要引入更多的类和接口来表示树形结构,增加了系统的复杂性。
  2. 对子节点的管理不够严格:由于客户端可能直接操作子节点,可能导致树形结构的混乱。

组合模式的类图


使用案例

案例 1:文件系统

  • 描述:在一个文件系统中,文件和文件夹都可以作为抽象组件。文件夹可以包含文件或其他文件夹,文件是叶子节点。
  • 操作:对文件和文件夹进行打开、删除等操作。

案例 2:图形系统

  • 描述:在一个图形系统中,基本形状(如圆形、矩形)和复杂图形(由基本形状组合而成)都可以作为组件。
  • 操作:绘制基本形状和复杂图形。

C++ 实现

#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;
}


C# 实现

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)
是否包含子节点
操作方式 实现具体功能 管理子节点并实现功能
典型场景 文件、图形基本形状等 文件夹、组合图形等
设计复杂性 简单 较复杂

总结

  1. 组合模式的关键:将单个对象和组合对象统一为树形结构,提供一致的操作方式。
  2. 使用时注意:合理管理子节点,避免误操作导致结构混乱。
  3. 典型应用:文件系统、GUI组件树、组织架构。

组合模式通过分层和组合,极大地提高了系统处理树形结构的能力,同时也对客户端代码的实现进行了很好的封装和抽象。

目录
相关文章
|
1月前
|
设计模式 Java C#
装饰模式(Decorator Pattern)
装饰模式是一种结构型设计模式,允许在不修改原有对象的情况下动态添加功能。它通过装饰类层层叠加实现功能扩展,适用于需要在运行时动态添加、修改或移除对象行为的场景。装饰模式的核心角色包括抽象组件、具体组件、抽象装饰和具体装饰。该模式的优点在于动态扩展功能、避免类爆炸和遵守开放-封闭原则,但可能会导致对象数量增加和调试困难。常见使用场景包括图形系统中的动态效果和输入流的功能扩展。
56 0
|
设计模式 机器学习/深度学习 Java
组合模式(Composite Pattern)
组合模式(Composite Pattern)是一种结构型设计模式。
89 0
|
存储 安全
组合模式(Composite)
组合模式(Composite)
121 0
|
设计模式 Java uml
设计模式15 - 组合模式【Composite Pattern】
设计模式15 - 组合模式【Composite Pattern】
39 0
|
存储 设计模式 安全
结构型模式 - 组合模式(Composite Pattern)
结构型模式 - 组合模式(Composite Pattern)
|
Java
装饰器模式(Decorator Pattern)
装饰器模式(Decorator Pattern)
104 0
装饰器模式(Decorator Pattern)
|
设计模式 存储 容器
【愚公系列】2021年12月 二十三种设计模式(八)-组合模式(Composite Pattern)
【愚公系列】2021年12月 二十三种设计模式(八)-组合模式(Composite Pattern)
123 0
【愚公系列】2021年12月 二十三种设计模式(八)-组合模式(Composite Pattern)
|
设计模式 安全 Java
设计模式|从Visitor Pattern说到Pattern Matching
在软件开发领域,我们每次遇到的问题可能都各不相同,有些是跟电商业务相关的,有些是跟底层数据结构相关的,而有些则可能重点在性能优化上。然而不管怎么样,我们在代码层面上解决问题的方法都有一定的共性。有没有人总结过这些共性呢?
设计模式|从Visitor Pattern说到Pattern Matching
|
安全 C# 容器
C#设计模式之九组合模式(Composite Pattern)【结构型】
原文:C#设计模式之九组合模式(Composite Pattern)【结构型】 一、引言      今天我们要讲【结构型】设计模式的第四个模式,该模式是【组合模式】,英文名称是:Composite Pattern。
1144 0