行为型模式之迭代器模式

概述

在软件开发中,我们经常需要使用聚合对象来存储一系列数据。聚合对象拥有两个职责:一是存储数据;二是遍历数据。从依赖性来看,前者是聚合对象的基本职责;而后者既是可变化的,又是可分离的。因此,可以将遍历数据的行为从聚合对象中分离出来,封装在一个被称之为“迭代器”的对象中,由迭代器来提供遍历聚合对象内部数据的行为,这将简化聚合对象的设计,更符合“单一职责原则”的要求。

定义

迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式

实现

迭代器接口

    public interface Iterator
    {
        void First(); //将游标指向第一个元素
        void Next(); //将游标指向下一个元素
        bool HasNext(); //判断是否存在下一个元素
        object CurrentItem(); //获取游标指向的当前元素
    }

聚合类

    interface IEnumerable
    {
        Iterator GetIterator();
    }
    public class List : IEnumerable
    {
        public List(int[] array)
        {
            this.arr = array;
        }
        int[] arr;
        public Iterator GetIterator()
        {
            return new ListIterator(this);
        }

        public int Length
        {
            get
            {
                return this.arr.Length;
            }
        }

        public int this[int index]
        {
            get
            {
                return arr[index];
            }
        }
    }

List的迭代类

    public class ListIterator : Iterator
    {
        private List list;
        private int _index = 0;

        public ListIterator(List list)
        {
            this.list = list;
        }
        public object CurrentItem()
        {
            return list[_index];
        }

        public void First()
        {
            _index = 0;
        }

        public bool HasNext()
        {
            return _index < list.Length;
        }

        public void Next()
        {
            if (_index < list.Length)
                _index++;
        }
    }

客户端

    class Program
    {
        static void Main(string[] args)
        {
            Iterator iterator = new ListIterator(new List(new int[] { 1, 3, 5, 7, 9 }));
            while (iterator.HasNext())
            {
                Console.WriteLine(iterator.CurrentItem());
                iterator.Next();
            }
            Console.ReadLine();
        }
    }

总结

迭代器模式是一种使用频率非常高的设计模式,通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成。由于很多编程语言的类库都已经实现了迭代器模式,因此在实际开发中,我们只需要直接使用Java、C#等语言已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。

主要优点

1、它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法,我们也可以自己定义迭代器的子类以支持新的遍历方式。

2、迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。

3、 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。

主要缺点

1、由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

2、抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展,例如JDK内置迭代器Iterator就无法实现逆向遍历,如果需要实现逆向遍历,只能通过其子类ListIterator等来实现,而ListIterator迭代器无法用于操作Set类型的聚合对象。在自定义迭代器时,创建一个考虑全面的抽象迭代器并不是件很容易的事情。

适用场景

1、访问一个聚合对象的内容而无须暴露它的内部表示。将聚合对象的访问与内部数据的存储分离,使得访问聚合对象时无须了解其内部实现细节。

2、需要为一个聚合对象提供多种遍历方式。

3、为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合结构提供不同的遍历方式,而客户端可以一致性地操作该接口。

时间: 2024-08-24 07:16:07

行为型模式之迭代器模式的相关文章

(18):(行为型模式) Iterator 迭代器模式

(18):(行为型模式) Iterator 迭代器模式

Java进阶篇设计模式之九----- 解释器模式和迭代器模式

前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解释器模式(Interpreter Pattern)和迭代器模式(Iterator Pattern). 解释器模式 简介 解释器模式顾名思义,就是对某事物进行解释.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 解释器模式

设计模式——行为型模式之迭代器模式(八)

迭代器模式 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为型模式. 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示. 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象. 关键代码:定义接口:hasNext, next. 应用实例:JA

行为型设计模式之迭代器模式

结构 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 适用性 访问一个聚合对象的内容而无需暴露它的内部表示. 支持对聚合对象的多种遍历. 为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代). 1 using System; 2 using System.Collections; 3 4 class Node 5 { 6 private string name; 7 public string Name 8 { 9 get 10 { 11 return

java-设计模式(行为型)-【迭代器模式】

1.迭代器模式(IteratorMode) 定义:迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常. 既有两个对象:一是聚集对象:需要遍历的对象.二是迭代器对象:用于对聚集对象进行遍历访问 关系图: 2.例子     2.1 集合 //集合接口:获取,长度方法 public interface Collection { //集合长度 int size(); //获取元素 char get(int pos); //添加元素 void put(char c); //获取迭代器 Iterat

25行为型模式之迭代器模式

概念 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式. 在应用Iterator模式之前,首先应该明白Iterator模式用来解决什么问题.或者说,如果不使用Iterator模式,会存在什么问题. 1.由容器自己实现顺序遍历.直接在容器类里直接添加顺序遍历方法 2.让调用者自己实现遍历.直接暴露数据细节给外部. 以上方法1与方法2都可以实现对遍历,这样有问题呢? 1,容器类承担了太多功能:一方

JavaScript---设计模式之迭代器模式

迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示. jQuery中我们经常会用到一个each函数就是迭代器模式 作用 为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作 对于集合内部结果常常变化各异,我们不想暴露其内部结构的话,但又想让客户代码透明的访问其中的元素,这种情况下我们可以使用迭代器模式. 注意事项 一般的迭代,我们至少要有2个方法,hasNext和Next,这样才做到遍历所有对象. 遍历的同时更改迭代器所在的集合

行为模式之迭代器模式

迭代器模式(Iterator Pattern)是最常被使用的几个模式之一,被广泛地应用到Java的API中. 定义:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节. 类图如下所示. 迭代器模式有以下4个角色. 抽象迭代器(Iterator)角色:负责定义访问和遍历元素的接口. 具体迭代器(Concrete Iterator)角色:实现Iterator接口,完成容器元素的遍历. 抽象聚集(Aggregate)角色:提供创建迭代器角色的接口. 具体聚集(Concrete Agg

设计模式5(命令模式,迭代器模式)

命令模式 本质是封闭请求,其关键是把请求封闭成对象,也就是命令对象,并定义了统一的执行操作的接口,这个命令可以存储.转发.记录.处理.撤消等.整个命令模式都是围绕这个对象进行. 命令模式       组合模式 宏命令的功能可以使用组合模式     备忘录模式   可以用来支持命令模式的撤销操作   模板方法     可与命令模式相互替换 迭代器Iterater 提供一种方法顺序访问聚合对象的各个元素,而不暴露该对象的内部表示 关键思想是把对聚合对象的访问从聚合对象中出来,放入单独的迭代器中. 迭