设计模式之迭代器模式

简介: 设计模式之迭代器模式

迭代器模式:是编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。


主要意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。


主要解决:不同的方式来遍历整个整合对象。


解决方案:把在元素之间游走的责任交给迭代器,而不是聚合对象。


优点:


1、它支持以不同的方式遍历一个聚合对象。


2、迭代器简化了聚合类。


3、在同一个聚合上可以有多个遍历。


4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。


缺点:


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


迭代器类图:



代码实现:


客户端代码:


using System;
namespace _01迭代器模式_基础模型
{
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteAggregate a = new ConcreteAggregate();
            a[0] = "大鸟";
            a[1] = "小菜";
            a[2] = "行李";
            a[3] = "老外";
            a[4] = "公交内部员工";
            a[5] = "小偷";
            //反向遍历
            Iterator i = new ConcreteIteratorDesc(a);
            //正向遍历
            //Iterator i = new ConcreteIterator(a);
            object item = i.First();
            while(!i.IsDone())
            {
                Console.WriteLine("{0} 请买票!", i.CurrentItem());
                i.Next();
            }
            Console.Read();
        }
    }
}


抽象聚合接口(合计):


using System;
using System.Collections.Generic;
using System.Text;
namespace _01迭代器模式_基础模型
{
    /// <summary>
    /// 合计
    /// </summary>
    abstract class Aggregate
    {
        //创建迭代器
        public abstract Iterator CreateIterator();
    }
}


抽象迭代器接口:

using System;
using System.Collections.Generic;
using System.Text;
namespace _01迭代器模式_基础模型
{
    abstract class Iterator
    {
        public abstract object First();
        public abstract object Next();
        //网络释义:完成
        public abstract bool IsDone();
        public abstract object CurrentItem();
    }
}


具体迭代器接口:


using System;
using System.Collections.Generic;
using System.Text;
namespace _01迭代器模式_基础模型
{
    class ConcreteIterator:Iterator
    {
        private ConcreteAggregate aggregate;
        private int current = 0;
        public ConcreteIterator(ConcreteAggregate aggregate)
        {
            this.aggregate = aggregate;
        }
        public override object First()
        {
            return aggregate[0];
        }
        public override object Next()
        {
            object ret = null;
            current++;
            if (current<aggregate.Count)
            {
                ret = aggregate[current];
            }
            return ret;
        }
        public override bool IsDone()
        {
            return current >= aggregate.Count ? true : false;
        }
        public override object CurrentItem()
        {
            return aggregate[current];
        }
    }
}


另一个接口:

using System;
using System.Collections.Generic;
using System.Text;
namespace _01迭代器模式_基础模型
{
    class ConcreteIteratorDesc:Iterator
    {
        private ConcreteAggregate aggregate;
        private int current = 0;
        public ConcreteIteratorDesc(ConcreteAggregate aggregate)
        {
            this.aggregate = aggregate;
            current = aggregate.Count - 1;
        }
        public override object First()
        {
            return aggregate[aggregate.Count - 1];
        }
        public override object Next()
        {
            object ret = null;
            current--;
            if (current >=0)
            {
                ret = aggregate[current];
            }
            return ret;
        }
        public override object CurrentItem()
        {
            return aggregate[current];
        }
        public override bool IsDone()
        {
            return current < 0 ? true : false;
        }
    }
}

具体聚合:

using System;
using System.Collections.Generic;
using System.Text;
namespace _01迭代器模式_基础模型
{
    class ConcreteAggregate:Aggregate
    {
        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); }
        }
    }
}

总结:迭代器模式可以控制外部访问容器内部数据的顺序。


相关文章
|
19天前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
37 2
|
28天前
|
设计模式 Java Kotlin
Kotlin - 改良设计模式 - 迭代器模式
Kotlin - 改良设计模式 - 迭代器模式
27 0
|
2月前
|
设计模式 Java 开发者
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文重点介绍迭代器模式,通过具体示例展示了如何在Kotlin中实现迭代器模式,包括使用Iterator、Iterable接口及重载iterator运算符的方法。
33 4
|
2月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
29 2
|
2月前
|
设计模式 Java 开发者
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
本教程详细讲解了Kotlin中的迭代器模式,包括如何通过实现Iterator和Iterable接口以及重载iterator运算符来实现可遍历的自定义集合。示例展示了如何创建一个图书集类,并通过不同方式使其支持遍历操作,适合希望深入了解Kotlin迭代器模式的开发者。
33 3
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
33 0
|
2月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
33 1
|
2月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
28 1
|
3月前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
5月前
|
存储 NoSQL Go
iLogtail设计模式问题之迭代器模式是如何应用的
iLogtail设计模式问题之迭代器模式是如何应用的