1. 概述
1.1 迭代器模式
1.2 组合模式
2. 模式组合使用场景
当需要遍历组合模式构建的树形结构时,迭代器模式能提供统一的访问方式。例如:
3. 迭代器示例
// 组合模式基础接口
public abstract class FileSystemComponent
{
public string Name { get; protected set; }
protected FileSystemComponent(string name)
{
Name = name;
}
public abstract void Add(FileSystemComponent component);
public abstract void Remove(FileSystemComponent component);
public abstract IEnumerator GetEnumerator();
}
// 叶子节点:文件
public class File : FileSystemComponent
{
public File(string name) : base(name) { }
public override void Add(FileSystemComponent component)
=> throw new InvalidOperationException("不能向文件中添加内容");
public override void Remove(FileSystemComponent component)
=> throw new InvalidOperationException("不能从文件中移除内容");
public override IEnumerator GetEnumerator()
{
// 文件本身是叶子节点,返回自己
yield return this;
}
}
// 复合节点:目录
public class Directory : FileSystemComponent
{
private List _children = new List();
public Directory(string name) : base(name) { }
public override void Add(FileSystemComponent component)
{
_children.Add(component);
}
public override void Remove(FileSystemComponent component)
{
_children.Remove(component);
}
public override IEnumerator GetEnumerator()
{
// 返回当前目录和所有子元素的迭代器
foreach (var component in _children)
{
yield return component;
}
}
}class Program
{
static void Main()
{
// 构建文件系统结构
var root = new Directory("根目录");
var documents = new Directory("文档");
documents.Add(new File("报告.docx"));
documents.Add(new File("简历.pdf"));
var pictures = new Directory("图片");
var vacationPhotos = new Directory("度假照片");
vacationPhotos.Add(new File("海滩.jpg"));
vacationPhotos.Add(new File("山脉.png"));
pictures.Add(vacationPhotos);
pictures.Add(new File("logo.png"));
root.Add(documents);
root.Add(pictures);
root.Add(new File("readme.txt"));
// 使用迭代器遍历所有文件(递归遍历)
TraverseComponents(root);
}
static void TraverseComponents(FileSystemComponent component)
{
foreach (var item in component)
{
if (item is Directory directory)
{
Console.WriteLine($"目录: {item.Name}");
TraverseComponents(directory); // 递归遍历
}
else
{
Console.WriteLine($"文件: {item.Name}");
}
}
}
}目录: 文档
文件: 报告.docx
文件: 简历.pdf
目录: 图片
目录: 度假照片
文件: 海滩.jpg
文件: 山脉.png
文件: logo.png
文件: readme.txt