文章目录
简单实现迭代器模式
一: 什么是迭代器模式
迭代器模式是 java 和 .NET 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层细节
- 意图:提供一种方法可以顺序的访问聚合对象中的各个元素,不需要知道集合对象的底层细节
- 何时使用:遍历一个集合对象
- 目标:把元素之间游走的责任交给迭代器,而不是聚合对象本身
二:类图
在后端语言中,实际上为了解耦会通过接口的方式产生依赖,而非两个类之间的依赖
三:JS简单实现迭代器模式
3.1:Iteratable 类
该类类似于一个容器类,通过调用该类的getIterator()方法将自身中所包含的集合元素通过Iterator的构造函数传入Iterator迭代器中
class Iteratable {
constructor(list) {
this.list = list;
}
getIterator() {
return new Iterator(this);
}
}
3.2:Iterator类(迭代器)
- haNext方法,通过偶判断当前的index是否大于或者等于集合的长度来得到该集合是否还会有下一个元素
- next方法,在判断该集合还有下一个元素的时候获取该集合元素中index下标的元素并返回该元素否则返回为空。
class Iterator {
constructor(container) {
this.list = container.list;
this.index = 0;
}
hasNext(){
if(this.index >= this.list.length)
{
return false;
}
return true;
}
next()
{
if(this.hasNext())
{
return this.list[this.index++];
}
return null;
}
}
3.3:测试结果
let iteratable = new Iteratable([1, 2, 3, 4, 5, 6]);
let iterator = iteratable.getIterator();
while (iterator.hasNext()) {
console.log(iterator.next());
}
四:c#实现迭代器模式
4.1:IIteratable接口
public interface IIteratable
{
int Count { get; }
IIterator GetIterator();
object this[int index] { get; set; }
}
4.2:IIterator接口
public interface IIterator
{
object Next();
bool HasNext();
}
4.3:Iteratable类
这里实现的基本逻辑和在JS中实现的逻辑一样,只是各种语言智能有各语言的语法优势,在这里我们就不会像JS中一样直接将一个list集合传给该类中的list集合中了,而是通过Set方法为每一个index下表依次赋值。
public class Iteratable : IIteratable
{
private IList<object> items = new List<object>();
public object this[int index]
{
get
{
return items[index];
}
set
{
items.Insert(index, value);
}
}
public int Count => items.Count();
public IIterator GetIterator()
{
return new Iterator(this);
}
}
4.4:Iterator类
public class Iterator : IIterator
{
private readonly IIteratable _iteratable;
private int current = 0;
public Iterator(IIteratable iteratable)
{
this._iteratable = iteratable;
}
public bool HasNext()
{
return current < _iteratable.Count;
}
public object Next()
{
if(HasNext())
{
return _iteratable[current++];
}
return default;
}
}
4.5:测试类
var iteratable = new Iteratable();
iteratable[0] = 1;
iteratable[1] = 2;
iteratable[2] = 3;
iteratable[3] = 4;
iteratable[4] = 5;
iteratable[5] = 6;
var iterator = iteratable.GetIterator();
while(iterator.HasNext())
{
var res = iterator.Next();
System.Console.WriteLine(res);
}
五:使用迭代器模式的经典案例SqlDataReader
我们可以从下面的代码中很清晰的看出SqlDataReader就是很典型的使用迭代器模式去遍历从数据库所查询到的所有元素
public class SqlHelper
{
public static void GetData()
{
using SqlConnection conn = new SqlConnection("Server=127.0.0.1;database=****;uid=**;pwd=**");
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM **", conn);
SqlDataReader reader = cmd.ExecuteReader();
do
{
while (reader.Read())
{
string userName =reader["**"].ToString();
}
}
while (reader.NextResult());
}
}