行为型设计模式——迭代器模式
提供一种方法顺序访问一个聚合对象中各个元素,且不需要暴露该对象的内部标识。核心思想是将集合的遍历行为抽象为独立对象,实现遍历逻辑与数据结构的解耦。
适用于
①访问一个聚合对象的内容而无须暴露它的内部表示。
②支持对聚合对象的多种遍历。
③为遍历不同的聚合结构提供一个统一的接口。
类图如下


1 internal class Program 2 { 3 static void Main(string[] args) 4 { 5 ConcreteAggregate<Student> aggregate = new ConcreteAggregate<Student>(); 6 7 aggregate.Add(new Student("张三", 30)); 8 aggregate.Add(new Student("李四", 22)); 9 aggregate.Add(new Student("万物", 122)); 10 aggregate.Add(new Student("赵丽", 24)); 11 12 var iterator = aggregate.GetIterator(); 13 14 while (iterator.HasNext()) 15 { 16 Student s = iterator.Next(); 17 Console.WriteLine(s); 18 } 19 } 20 }
1 /// <summary> 2 /// 抽象迭代器类 3 /// 定义迭代的抽象方法 4 /// </summary> 5 /// <typeparam name="T"></typeparam> 6 internal interface Iterator<T> 7 { 8 bool HasNext(); 9 T Next(); 10 }
1 /// <summary> 2 /// 具体迭代器类 3 /// 可以有多种遍历方式 4 /// </summary> 5 /// <typeparam name="T"></typeparam> 6 internal class ArrayListIterator<T> : Iterator<T> 7 { 8 private List<T> List; 9 private int Postion = 0; 10 11 public ArrayListIterator(List<T> list) 12 { 13 List = list; 14 } 15 public bool HasNext() 16 { 17 return Postion < List.Count(); 18 } 19 20 public T Next() 21 { 22 //先返回,后++ 23 return List[Postion++]; 24 } 25 }
1 /// <summary> 2 /// 聚合对象类容器 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 internal class ConcreteAggregate<T> : IAggregate<T> 6 { 7 private List<T> list = new List<T>(); 8 public void Add(T t) 9 { 10 list.Add(t); 11 } 12 13 public T Get(int index) 14 { 15 return list[index]; 16 } 17 18 public void Remove(T t) 19 { 20 list.Remove(t); 21 } 22 23 public Iterator<T> GetIterator() 24 { 25 return new ArrayListIterator<T>(list); 26 } 27 }
1 /// <summary> 2 /// 聚合接口,,用来申明对集合对象的操作 3 /// </summary> 4 internal interface IAggregate<T> 5 { 6 //添加对象 7 public void Add(T t); 8 //删除对象 9 public void Remove(T t); 10 //获取对象 11 public T Get(int index); 12 13 //获取具体迭代器类 14 public Iterator<T> GetIterator(); 15 16 }
1 /// <summary> 2 /// 数据类 3 /// </summary> 4 internal class Student 5 { 6 public string Name { get; set; } 7 public int Age { get; set; } 8 9 public Student() 10 { 11 12 } 13 14 public Student(string name, int age) 15 { 16 Name = name; 17 Age = age; 18 } 19 20 public override string ToString() 21 { 22 return $"Name={Name},Age={Age}"; 23 } 24 }

浙公网安备 33010602011771号