zoukankan      html  css  js  c++  java
  • 迭代模式

    不就是迭代模式吗,就是第一个,上一个,下一个,最后一个,当前元素吗?
    用得着搞几个接口弄出五六个类出来吗?
    而且元素还是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];
           }
    
           
        }
    }
  • 相关阅读:
    mysql事务隔离级别回顾
    单链表倒数第K个节点的查找和显示
    mysql 行转列,对列的分组求和,对行求和
    获取分组后统计数量最多的纪录;limit用法;sql执行顺序
    You can't specify target table 'e' for update in FROM clause
    mysql 行转列 (结果集以坐标显示)
    springmvc执行流程 源码分析
    jdk动态代理 案例
    项目日志log管理
    apache和tomcat的区别
  • 原文地址:https://www.cnblogs.com/hlxs/p/2087979.html
Copyright © 2011-2022 走看看