迭代器模式
介绍
|-------|-------------------------------------|-----------------------------------------------|
| 设计模式 | 定义 | 案例 |
| 迭代器模式 | 行为型:关注对象与行为的分离 提供了一种统一的方式来访问多个不同的集合 | 两个集合:使用了不同的数据存储方式 学生 和 警察 查询显示出集合的内容 ,使用相同的代码 |
|------------------|---------------------------------------------------------------------|
| 问题堆积在哪里 | 解决办法 |
| 不同的存储方式 统一集合查询代码 | 1 统一出一个存储方式 2 设计一个查询基类来统一查询代码 3 每个集合提供 1 统一存储方式, 2 一个查询实现(接口迭代器的实现) |
类图
代码
interface BaseIterator<T>
cs
/// <summary>
/// 迭代器基类
/// </summary>
public interface BaseIterator<T>
{
// 当前
T Current();
// 下一个
bool MoveNext();
// 重新开始
void Reset();
}
IteratorPolice
cs
using System.Collections.Generic;
public class IteratorPolice : BaseIterator<People>
{
// 列表
List<People> listPeople = null;
// 下标
int currentIndex = -1;
IteratorPolice() { }
public IteratorPolice(List<People> list)
{
listPeople = list;
}
public People Current()
{
if (null == listPeople)
return null;
if (listPeople.Count < currentIndex)
return null;
return listPeople[currentIndex];
}
public bool MoveNext()
{
if (null == listPeople)
return false;
if (listPeople.Count > ++currentIndex)
return true;
return false;
}
public void Reset()
{
currentIndex = -1;
}
}
IteratorStudent
cs
using System.Collections.Generic;
public class IteratorStudent : BaseIterator<People>
{
// 列表
List<People> listPeople = null;
// 下标
int currentIndex = -1;
IteratorStudent() { }
public IteratorStudent(List<People> list)
{
listPeople = list;
}
public People Current()
{
if (null == listPeople)
return null;
if (listPeople.Count < currentIndex)
return null;
return listPeople[currentIndex];
}
public bool MoveNext()
{
if (null == listPeople)
return false;
if (listPeople.Count > ++currentIndex)
return true;
return false;
}
public void Reset()
{
currentIndex = -1;
}
}
People
cs
public class People
{
public string name;
public int age;
public bool married;
}
StudentList
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StudentList
{
private List<People> list = new List<People>();
private People[] studentList = new People[3];
public StudentList()
{
People p1 = new People()
{
name = "WH",
age = 15,
married = false
};
studentList[0] = p1;
People p2 = new People()
{
name = "QT",
age = 16,
married = false
};
studentList[1] = p2;
People p3 = new People()
{
name = "YY",
age = 15,
married = false
};
studentList[2] = p3;
for (int i = 0; i < studentList.Length; i++)
{
list.Add(studentList[i]);
}
}
public BaseIterator<People> GetIterator()
{
return new IteratorStudent(list);
}
}
PoliceList
cs
using System.Collections.Generic;
public class PoliceList
{
private List<People> list = new List<People>();
public PoliceList()
{
People p1 = new People()
{
name = "WangQiang",
age = 23,
married = false
};
list.Add(p1);
People p2 = new People()
{
name = "ZhangQiang",
age = 30,
married = true
};
list.Add(p2);
People p3 = new People()
{
name = "LingQiang",
age = 31,
married = true
};
list.Add(p3);
}
public BaseIterator<People> GetIterator()
{
return new IteratorPolice(list);
}
}
测试代码
cs
using UnityEngine;
public class TestDDQ : MonoBehaviour
{
void Start()
{
{
PoliceList pl = new PoliceList();
BaseIterator<People> iterator = pl.GetIterator();
while (iterator.MoveNext())
{
People p1 = iterator.Current();
Debug.Log("姓名:" + p1.name + " 年龄:" + p1.age + " 是否结婚:" + p1.married + " ");
}
}
Debug.Log("------------------------------------------------------------------");
{
StudentList pl = new StudentList();
BaseIterator<People> iterator = pl.GetIterator();
while (iterator.MoveNext())
{
People p1 = iterator.Current();
Debug.Log("姓名:" + p1.name + " 年龄:" + p1.age + " 是否结婚:" + p1.married + " ");
}
}
}
}
结果
总结
迭代器模式统一集合查询代码,以这个为目标进现优化总结出的一个经验。
还是为了更深刻的理解设计原理和优化手段。