枚举器模式-Iterator Pattern -使用 foreach 语句、实现多个枚举器

说明:我也是初学者,希望大家能提出宝贵意见。另外转载请注明作者左洸和出处CSDN,毕竟花费了很长时间才完成

点击浏览更多的“说故事、学模式”系列

        一、两个概念

        1、聚集:所谓聚集就是一组数据集或者对象集,它可以通过循环来访问 。

        2、枚举器: 专门用来访问聚集的类,他包装了一定的方法,可以依次把聚集中的数据按照一定的顺序读出来。

        二、枚举器模式中出现的接口和类

        1、Aggregate 接口:抽象的聚集,通常只留有一个方法让子类去实现,这个方法的作用是获得一个枚举器对象,通常可以起名字为 GetIterator( )CreateIterator( ) 等等,或者干脆叫做 Iterator( ) 也行。在 C# 中,这个方法的名字叫做 GetEnumerator( ) ,这个我们到后面再讲。当然,在获得枚举器的同时,也要把自己 this(一组数据集)当作参数传给枚举器,想想也是,如果没有数据集,枚举器去枚举什么呢?

        2、ConcreteAggregate 类:具体的聚集,它的实例保存了一组数据集,同时它实现了 Aggregate 接口中唯一的那个方法,通常情况下他也会扩展出一些其他方法便于访问聚集中的数据,常见的有:访问某个位置数据的方法,可以叫做 GetElement(int index) 或者 GetItem(int index) 等等;获得聚集大小的方法,可以起名字为 GetLength( ) 或者 GetSize( ) 等等,全看自己喜好。

        3、Iterator 接口:抽象的枚举器,通常情况下会有三个方法留给子类去实现,他们分别是:Next( ) ,用来把指针移动到聚集中的下一个数据;HasNext( ) ,用来判断是否还有下一个数据;CurrentItem( ),返回当前指针所指位置的数据。也可以把 Next( ) CurrentItem( )
组成一个方法,在移动指针的同时返回一个数据。也可以有其他的实现方式,或者简单,或者复杂,也是全看个人需求。

        4、ConcreteIterator 类:具体的枚举器,它实现了上述的三个方法,通过不同的实现方式,我们可以获得不同的枚举方式,如顺序枚举、倒序枚举等等。当然,这个类的构造方法中会接受一个具体聚集参数,想想也是,如果没有这个数据集,他去枚举什么呢?这个参数就是他要去枚举的对象。

        5、被聚集的类,这个可以是任何类,它的许多个对象被存到聚集对象中才能形成一个真正的聚集,在我的例子中用的类叫 Book 类,它的四个实例即四本书形成一个聚集。下面看具体的代码吧。

        三、常规枚举器模式的代码实现

        这里用到“常规”这个词是指,这里的代码可以当作一个模版来用,不管你用的是 C# 还是 Java 或者是 Delphi ,均可以按照这个模版来实现枚举器模式。当然在 C# 和 Java 中,因为它们本身就支持枚举器模式,实现起来更方便一些,C#  的实现方法会在后面给出。

        我把客户端代码和模式类代码分别放在两个文件中。

        下面是模式类代码 Iterator.cs

using  System;

namespace  Iterator
{
    
/// <summary>
    
/// 一个普通的书籍类,它的许多实例可以形成一个聚集
    
/// </summary>

    public class Book
    
{
        
string name;
        
        
public Book(string name)
        
{
            
this.name=name;
        }


        
public string GetName()
        
{
            
return name;
        }

    }



    
/// <summary>
    
/// 抽象的聚集接口
    
/// </summary>

    public interface IAggregate
    
{
        IIterator GetIterator();
    }



    
/// <summary>
    
/// 书架,它是一个具体的聚集类,在这里是书的聚集
    
/// 所有聚集的共同点是,它会创建一个枚举器
    
/// 同时把自己当作参数传给枚举器,好让这个枚举器可以枚举自己
    
/// </summary>

    public class BookShelf:IAggregate
    
{
        
private Book[] books;
        
        
public BookShelf()
        
{
            books
=new Book[4];
            books[
0]=new Book("Around the World in 80 Days");
            books[
1]=new Book("Bible");
            books[
2]=new Book("Cinderella");
            books[
3]=new Book("Dady-long-legs");
        }


        
public Book GetElement(int index)
        
{
            
return books[index];
        }


        
public int GetLength()
        
{
            
return books.Length ;
        }


        
public IIterator GetIterator()
        
{
            
//  把自己  一个书架实例  传到一个具体的枚举器中,好让枚举器工作
            return new BookShelfIterator(this);
        }

    }



    
/// <summary>
    
/// 枚举器接口,抽象的,由它去枚举聚集
    
/// </summary>

    public interface IIterator
    
{
        
bool HasNext();
        Object CurrentItem();
        
void Next();
    }



    
/// <summary>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值