行为型设计模式——迭代器模式

提供一种方法顺序访问一个聚合对象中各个元素,且不需要暴露该对象的内部标识。核心思想是将集合的遍历行为抽象为独立对象,实现遍历逻辑与数据结构的解耦。

适用于

①访问一个聚合对象的内容而无须暴露它的内部表示。

②支持对聚合对象的多种遍历。

③为遍历不同的聚合结构提供一个统一的接口。

类图如下

 

 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     }
View Code
 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     }
View Code
 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     }
View Code
 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     }
View Code
 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     }
View Code

 

posted @ 2025-04-17 21:50  是铭不是明  阅读(10)  评论(0)    收藏  举报