迭代模式

不就是迭代模式吗,就是第一个,上一个,下一个,最后一个,当前元素吗?
用得着搞几个接口弄出五六个类出来吗?
而且元素还是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];
       }

       
    }
}

 

posted @ 2011-04-08 11:17  啊汉  阅读(827)  评论(0编辑  收藏  举报