//不就是迭代模式吗,就是第一个,上一个,下一个,最后一个,当前元素吗?
//用得着搞几个接口弄出五六个类出来吗?
//而且元素还是Object类型,装箱,拆箱的,真要命,用泛型吧
//有时候在想,设计模式是用来欣赏的、用来学习的,真正在用的时候根本用不上,那么多接口和类,调来调去的
//不好资源的吗?真正在用的时候应该是精简版的设计模式,你也可以说他不是设计模式,毕竟嘴是你的。
//如果你的方法参数为基础类型,没有用out或ref,C#就会为你产生一个变量,因为基础类型是值拷贝
//当然基础类型分配在栈中,分配速度较快,而且能很快回收,栈的容量是有限的吗,能不很快回收吗。
//栈是先进后出,比如一个方法中的基础类型变量,先定义的先进栈,却后释放,什么叫压栈,就是这个道理啦。
//引用类型参数一般不会产生多余的变量,引用类型就是引用对象的地址,直接对对象的地址内容进行操作
//引用类型分配在托管堆中,在其中分配资源的速度相对栈较慢,因为需要寻找空闲内存,搜集整理内存碎片,都是要时间的。
//托管堆中的资源什么时候被GC回收是不知道的,当然不会很久,这种事情是不能拖的,他可跟控件不同,你想脱就脱啊。
namespace ClassTest
{
/// <summary>
/// 迭代模式
/// </summary>
public class Iterator<T>
{
private ConcreteList<T> concreteList;
//索引值
int index;
public Iterator(ConcreteList<T> concreteList)
{
index = 0;
this.concreteList = concreteList;
}
/// <summary>
/// 第一个元素
/// </summary>
public void First()
{
index = 0;
}
/// <summary>
/// 最后一个元素
/// </summary>
public void Last()
{
index = concreteList.Count - 1;
}
/// <summary>
/// 当前元素
/// </summary>
/// <returns></returns>
public T CurrentItem()
{
return concreteList.GetCurrent(index);
}
/// <summary>
/// 下一个元素
/// </summary>
/// <returns></returns>
public bool Next()
{
if (++index >= concreteList.Count) //如果当前元素已经最后一个元素,返回false
{
return false;
}
return true;
}
/// <summary>
/// 上一个元素
/// </summary>
private void Previous()
{
if (index > 0)
{
index--;
}
}
}
}
using System;
using System.Collections.Generic;
namespace ClassTest
{
/// <summary>
/// 实体集合
/// 对元素进行添加、删除和显示
/// </summary>
/// <typeparam name="T"></typeparam>
public class ConcreteList<T>
{
private IList<T> list;
public ConcreteList()
{
list = new List<T>();
}
/// <summary>
/// 添加元素
/// </summary>
/// <param name="t"></param>
public void Add(T t)
{
list.Add(t);
}
/// <summary>
/// 删除指定元素
/// </summary>
/// <param name="t"></param>
public void Remove(T t)
{
list.Remove(t);
}
/// <summary>
/// 根据索引删除元素
/// </summary>
/// <param name="index"></param>
public void RemoveAt(int index)
{
if (Count <= index) //索引超出范围
{
throw new ArgumentOutOfRangeException("index");
}
list.RemoveAt(index);
}
/// <summary>
/// 元素个数
/// </summary>
public int Count
{
get {
return list.Count;
}
}
/// <summary>
/// 获取当前元素
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public T GetCurrent(int index)
{
if (Count == 0) //处理集合为空的情况
{
return default(T);
}
if (Count<=index) //索引超出范围
{
throw new ArgumentOutOfRangeException("index");
}
return list[index];
}
}
}