【设计模式】——迭代模式

前言:

迭代,从字面的意思就可以了解到,是一个接着一个。比如公交车上的售票员,在每一个站

过后都会对上来的乘客进行遍历一遍,不会放过一个不买票的乘客,不管你是人,过大的行李,

不管你是中国人还是外国人,不管你是内部员工,甚至哪怕是马上要抓走的小偷,只要是来乘车

的乘客,就必须要买票。同样的道理,当你需要访问一个聚集的对象,而且不管这些对象是什

么,都要遍历的时候,你就应该考虑用迭代器模式。

由于不管乘客是什么,售票员的做法始终是相同的,都是从第一个开始,下一个是谁,是否

接受,当前售到那个人,谢谢方法每天他都在做,也就是说,为遍历不同的聚集结果提供如开

始、下一个、师傅结束、当前那一项等统一的接口。

 迭代模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露给对

象的内部表示。

二、从 UML 图来看如下:

三、实现的代码:

1、Iterator迭代器抽象类:

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 迭代模式
{
    //定义得到开始对象,得到下一个对象,判断是否到结尾,当前对象等等抽象方法,统一接口。
    abstract class Iterator
    {
        public abstract object First(); //定义得到开始对象
        public abstract object Next();  //得到下一个对象
        public abstract bool IsDone();  //判断是否到结尾,
        public abstract object CurrentItem();//统一接口。
    }

}</span>

2、Aggregate聚集抽象类:

<span style="font-size:18px;">//聚集抽象类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 迭代模式
{
    //创建迭代器
  abstract  class Aggregate
    {
      public abstract Iterator CreateIterator();
</span>
    }
}

3、ConcreteIterator 具体迭代器类,继承Iterator:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 迭代模式
{
    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;                      //ret 在这是什么意思?
            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];
        }

        //判断当前师傅偏历到结尾,到结尾返回True

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

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

4、ConcreteAggregate 具体聚集类 继承Aggregate:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 迭代模式
{
    class ConcreteAggregate : Aggregate
    {

        //声明一个IList泛型变量,用于存放聚合对象,用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); }

        }

    }

}

5、客户端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 迭代模式
{
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteAggregate a = new ConcreteAggregate(); //公交车 聚集对象
            //新上来乘客,即对象组

            a[0] = "大鸟";
            a[1] = "小菜";
            a[2] = "行李";
            a[3] = "公交内部员工";+
            a[4] = "小偷";

            Iterator i = new ConcreteIterator(a);  //售票员处处,先看好上车是哪些人,也即是声明迭代对象

            object item = i.First();

            while (!i.IsDone())  //从第一个乘客开始
            {
                Console.WriteLine("{0} 请买车票!",i.CurrentItem());
                i.Next();

            }
            Console.Read();
        }
    }
}

显示结果:

  四、错误小调试;

迭代模式出现的问题:

1、数组的赋值必须从“0” [0]开始,所以,如下是之前的代码,就是从[1] 开始,所以出错,运行不下去,

<span style="font-size:18px;">a[1] = "大鸟";
a[2] = "小菜";
a[3] = "行李";
a[4] = "公交内部员工";
a[5] = "小偷";</span>

更改成:

 <span style="font-size:18px;">a[0] = "大鸟";
 a[1] = "小菜";
 a[2] = "行李";
 a[3] = "公交内部员工";
 a[4] = "小偷";</span>

——之后问题解决。

2、是非常非常的基本的少敲了代码,所以客户端中的显示没有出来!

<span style="font-size:18px;">        Console.WriteLine("{0} 请买车票!",i.CurrentItem());</span>

小结:

迭代器(Iterator)模式就是分离了集合对象的遍历行为,抽象出一个迭代器来负

责,这样既可以做到不暴露计划的内部结构,有可以让外部代码透明地访问计划内部数

据。从开头的那个例子就可以看出,那个售票员就是一个了不起?的迭代高手,每一次有

乘客上车,他都数数,统计人数,然后再对整车的乘客进行迭代遍历,不放过任何漏网

之鱼。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 11:07:30

【设计模式】——迭代模式的相关文章

设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包括迭代器接口(iterator interface), import java.util.Iterator; 继承

PHP设计模式——迭代模式

声明:这一系列的博客引用<大话设计模式>.程洁作者. 迭代器模式:迭代器模式是遍历集合的成熟模式.迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而client程序猿不必知道或关心该集合序列底层的结构. UML类图: 角色: Iterator(迭代器):迭代器定义訪问和遍历元素的接口 ConcreteIterator(详细迭代器):详细迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置 Aggregate (聚合):聚合定义创建对应迭代器对象的接口(

24种设计模式--迭代模式【Iterator Pattern】

周五下午,我正在看技术网站,第六感官发觉有人在身后,扭头一看,我 C,老大站在背后,赶忙站起来,“王经理,你找我?” 我说. “哦,在看技术呀.有个事情找你谈一下,你到我办公室来一下.” 老大说. 到老大办公室,“是这样,刚刚我在看季报,我们每个项目的支出费用都很高,项目情况复杂,人员情况也不简单,我看着也有点糊涂,你看,这是我们现在还在开发或者维护的 103 个项目,你能不能先把这些项目信息重新打印一份给我,咱们好查查到底有什么问题.”老大说. “这个好办,我马上去办”我爽快的答复道.很快我设

设计模式: 迭代模式

前言 在寻常生活其中,我们常常要使用到迭代器.比如在观看一组图片时,我们常常使用遍历的方法观看,我们并不须要详细研究图片的结构,仅仅须要遍历,而且能够将当前的遍历状态记录下来,下次观看时能够从之前的遍历终止点開始继续. 即在面向对象的软件设计中,我们常常会遇到一类集合对象.这类集合对象的内部结构可能有着各种各样的实现.可是最重要的是有两点是须要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据.面向对象设计原则中有一条是类的单一职责原则.所以我们要尽可能的去分解这些职责,用不同的类

java设计模式--行为型模式--迭代模式

1 迭代器模式 2 概述 3 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 4 5 6 适用性 7 1.访问一个聚合对象的内容而无需暴露它的内部表示. 8 9 2.支持对聚合对象的多种遍历. 10 11 3.为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代). 12 13 14 参与者 15 1.Iterator 16 迭代器定义访问和遍历元素的接口. 17 18 2.ConcreteIterator 19 具体迭代器实现迭代器接口.

大话设计模式笔记 组合模式 迭代模式 单例模式

组合模式(Composite),将对象组合合成树形以表示“部门整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 一句话说就是利用树这种数据结构储存对象. 迭代模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 数据结构内容. 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问他的 全局访问点. efficient java 中已经详细介绍了

《Java设计模式》之迭代模式

迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(internal representation). 聚集和JAVA聚集 多个对象聚在一起形成的总体称之为聚集(Aggregate),聚集对象是能够包容一组对象的容器对象.聚集依赖于聚集结构的抽象化,具有复杂化和多样性.数组就是最基本的聚集,也是其他的JAVA聚集对象的设计基础. JAVA聚集对象是实现了共同的java.util.Collection接口的对象,是JAVA语言

Java设计模式(二)——迭代模式

迭代模式的基本定义:对于一组对象集合(数组.堆栈.列表或散列),用户无需关心它的底层实现而能够通过调用统一接口遍历当中的所有元素.由于jdk已经对常见的迭代模式实现了封装,本文直接提供Collection和Iterator两个接口的模拟. 定义Iterator接口 /* * 设计迭代接口 */ public interface Iterator<E> { // 测试是否有下一个元素 boolean hasNext(); // 返回下一个元素 E next(); } Iterator.java

JavaScript设计模式 - 迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素 许多浏览器都支持 Javascript 的 Array.prototype.forEach 迭代器可以分为 内部迭代器 和 外部迭代器 一.jQuery 中的迭代器 1 $.each( [1,2,3,4], function (i, n) { 2 console.log( "当