随笔 - 268  文章 - 0  评论 - 1028  阅读 - 160万

“一个都不能少”:迭代器模式

1、迭代器模式:提供一种方法顺序访问一个集合对象中各个元素,而又不暴露该对象的内部表示。
这是它的结构图:

2、迭代器模式应用场合:当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,可以考虑使用该模式。
举个不恰当的例子,个人认为杀毒软件在遍历文件夹“排查”杀毒时可以认为是一个典型的迭代器模式的运用。因为当我们设置杀毒软件进行查杀病毒时,不管我们设置查杀文件类型为普通文件,压缩包还是隐藏的系统文件等等,杀毒软件都必须遍历这些文件进行病毒库特征匹配查杀。
3、最后,按照惯例,贴代码:
复制代码
using System;
using System.Collections;
using System.Collections.Generic;

namespace IteratorPattern
{
    
/// <summary>
    
/// 迭代器抽象类
    
/// </summary>
    abstract class Iterator
    {
        
public abstract object First();
        
public abstract object Next();
        
public abstract bool IsDone();
        
public abstract object CurrentItem();
    }

    
/// <summary>
    
/// 聚集抽象类
    
/// </summary>
    abstract class Aggregate
    {
        
public abstract Iterator CreateIterator(); //创建迭代器
    }

    
/// <summary>
    
/// 具体迭代器类,这里默认将集合元素从头到尾遍历,我们可以按照需要,声明不同的具体迭代器按从尾到头遍历等等
    
/// </summary>
    class ConcreteIterator : Iterator
    {
        
private ConcreteAggregate aggregate; //具体聚集
        private int current = 0;

        
/// <summary>
        
/// 初始化时,将具体聚集传入
        
/// </summary>
        
/// <param name="aggregate"></param>
        public ConcreteIterator(ConcreteAggregate aggregate)
        {
            
this.aggregate = aggregate;
        }

        
public override object First()
        {
            
return aggregate[0];
        }

        
public override object Next()
        {
            
object retObj = null;
            current
++;
            
if (current < aggregate.Count)
            {
                retObj 
= aggregate[current];
            }
            
return retObj;
        }

        
public override bool IsDone()
        {
            
return current >= aggregate.Count ? true : false;
        }

        
public override object CurrentItem()
        {
            
return aggregate[current]; //返回当前聚集对象
        }
    }

    
/// <summary>
    
/// 具体聚集类
    
/// </summary>
    class ConcreteAggregate : Aggregate
    {
        
//声明一个list泛型变量,用于存放集合对象,用其他集合如ArrayList同样可以实现
        private IList<object> items = new List<object>(); 
        
public override Iterator CreateIterator()
        {
            
return new ConcreteIterator(this);
        }

        
public int Count
        {
            
get { return items.Count; } //返回聚集总个数
        }

        
// 声明一个索引器
        public object this[int index]
        {
            
get { return items[index]; }
            
set { items.Insert(index, value); }
        }

    }

    
/// <summary>
    
/// 客户端调用 
    
/// </summary>
    class Program
    {
        
static void Main(string[] args)
        {
            ConcreteAggregate aggregate 
= new ConcreteAggregate(); // 把它们对应于例子中的文件夹,即具体聚集 

            aggregate[
0= "c盘system32文件夹文件"//添加要被杀毒的文件夹,即对象数组
            aggregate[1= "c盘program文件夹文件";
            aggregate[
2= "d盘游戏文件夹文件";
            aggregate[
3= "e盘所有文件";

            Iterator myIterator 
= new ConcreteIterator(aggregate); //声明迭代器对象,准备要遍历的已选中的文件夹
            object item = myIterator.First(); //取出第一个文件夹
            Console.WriteLine("第一个待查杀文件夹:{0}", item);
            
while (!myIterator.IsDone())
            {
                Console.WriteLine(
"{0} 已被查杀", myIterator.CurrentItem());
                myIterator.Next(); 
//继续往下遍历
            }

            Console.ReadLine();
        }
    }
}
复制代码
ps:关于.net中的迭代器,笔者在上一篇最后一部分已经做了简要介绍,读者可自行参考。
posted on   JeffWong  阅读(561)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2009年6月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11

I know how to make it works and I want to know how it works.
点击右上角即可分享
微信分享提示