一、定义
提供一种方法循序访问一个聚合对象中各个元素,而又不暴露该对象地内部表示
和Foreach in 功能相同
Aggregate类:聚焦抽象类提供创建迭代器地方法
ConcreteAggregatelei:具体聚焦类,继承Aggregate类
Iterator:迭代抽象类,用于定义得到开始对象,得到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口。
ConcreteIterator类:具体的迭代器类,继承Iterator,实现其中的方法,可以在这儿修改实现不同的遍历方法。
二、特点
可以采用多种方式进行遍历
三、什么时候使用
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历地时候,就应该考虑用迭代器模式
四、实例
①、迭代器实现
Iterator类(迭代器抽象类)
abstract class Iterator//用于定义得到开始对象,得到下一个对象、判断是否到结尾、当前随想等抽象方法统一接口 { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); }
Aggregate类(聚集抽象类)
abstract class Aggregate { public abstract Iterator CreateIerator();//创建迭代器 }
ConcreteIterator类(具体迭代器,继承Iterator)
class ConcreteIterator:Iterator { private ConcreteAggregate aggregate; //定义一个具体的聚焦对象 private int current = 0; public ConcreteIterator (ConcreteAggregate aggregate ) //初始化将聚焦对象传入 { this.aggregate = aggregate; } public override object First() //得到第一个聚焦对象 { return aggregate[0]; } public override object Next() //得到下一个聚焦对象 { object ret = null; current++; if (current <aggregate.Count) { ret = aggregate[current]; } return ret; //返回一个对象 } public override bool IsDone() //判断时候遍历到末尾,到末尾返回true { return current >= aggregate.Count ?true :false; } public override object CurrentItem() { return aggregate[current]; //返回当前聚焦对象 } }
ConcreteAggregate类:(具体聚焦类,继承Aggregate)
class ConcreteAggregate:Aggregate { private IList<object> items = new List<object>(); //声明一个Ilist泛型变量,用于存放聚合对象 public override Iterator CreateIerator( ) { return new ConcreteIterator(this); } public int Count //返回聚合总数 { get { return items.Count; } } public object this[int index] //明一个索引 { get { return items[index]; } set { items.Insert(index, value); } } }
类图关系
五、涉及知识点
1.关系
依赖:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。就好比动物依赖氧气和水。
实现:发生依赖关系的两个类都不会增加属性。其中一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已
图形:虚线+箭头
关联:对于两个独立的对象当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时 关系为关联关系。单向关联,双向
实现:发生关联关系的两个类,其中的一个类成为另一个类的属性
图形:实线+箭头
2.集合
1.ArrayList
是命名空间System.Collection下的一部分,它是使用大小可按需求动态增的的数组实线IList接口
ArrayList的容量是ArrayList可以保存的元素数。ArrayList的默认初始容量为0,随着元素添加到ArrayLIst中,容量会自动增加。
缺点:因为在ArrayLIst眼里所有元素都是object类型,,在使用元素的时候需要进行拆箱,胡进行大量计算。
3.泛型
泛型集合:首先泛型集合需要System.Collection.Generic的命名空间。List类是ArrayList类的泛型等效类。用法的关键就是在IList和list后面加<T>T是之指定集合或对象类型
通常情况下都建议使用泛型结合,不必对元素进行装箱。