在C#中,组合模式(Composite Pattern)是一种结构型设计模式,它允许您将对象组合成树状的结构,以表示部分-整体的层次关系,使得客户端可以以一致的方式处理单个对象和对象组合。
在组合模式中,有以下几个角色:
Component(组件):是组合中所有对象的通用接口,可以是抽象类或接口。它声明了一些操作的方法,例如添加、删除和获取子组件。
Leaf(叶子节点):表示组合中的叶子对象,没有子节点。它实现了Component接口的方法。
Composite(组合节点):表示具有子节点的复合对象,在组合中可以包含其他叶子节点或者复合节点。它实现了Component接口的方法,并包含一个子组件列表。
namespace CompositePattern_组合模式
{
internal class Program
{
// Component
public abstract class FileSystemComponent
{
protected string name;
public FileSystemComponent(string name)
{
this.name = name;
}
public abstract void Add(FileSystemComponent component);
public abstract void Remove(FileSystemComponent component);
public abstract void Display(int depth);
}
// Leaf
public class File : FileSystemComponent
{
public File(string name) : base(name)
{
}
public override void Add(FileSystemComponent component) { }
public override void Remove(FileSystemComponent component) { }
public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + name);
}
}
// Composite
public class Directory : FileSystemComponent
{
private List<FileSystemComponent> components = new List<FileSystemComponent>();
public Directory(string name) : base(name) { }
public override void Add(FileSystemComponent component)
{
components.Add(component);
}
public override void Remove(FileSystemComponent component)
{
components.Remove(component);
}
public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + name);
foreach (var component in components)
{
component.Display(depth + 2);
}
}
}
static void Main(string[] args)
{
// 创建文件和目录
FileSystemComponent file1 = new File("file1.txt");
FileSystemComponent file2 = new File("file2.txt");
FileSystemComponent file3 = new File("file3.txt");
Directory dir1 = new Directory("dir1");
Directory dir2 = new Directory("dir2");
Directory dir3 = new Directory("dir3");
// 构建文件系统的层次结构
dir1.Add(file1);
dir2.Add(file2);
dir3.Add(file3);
dir1.Add(dir2);
dir1.Add(dir3);
// 显示文件系统
dir1.Display(0);
Console.Read();
//输出结果
//dir1
//--file1.txt
//--dir2
//----file2.txt
//--dir3
//----file3.txt
}
}
}
在上述示例中,使用组合模式创建了一个文件系统的层次结构。FileSystemComponent作为抽象的组件,File作为叶子节点,Directory作为复合节点,并实现了相应的操作方法。客户端可以以一致的方式处理文件和目录对象,并按层次结构显示文件系统。
组合模式在需要表示部分-整体的层次关系时非常有用,它提供了一致性的接口和简化客户端的代码。它还支持递归组合,使得可以灵活地处理复杂的层次结构。