设计模式——迭代器模式

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

一、定义

提供一种方法循序访问一个聚合对象中各个元素,而又不暴露该对象地内部表示

Foreach in 功能相同
Aggregate类:聚焦抽象类提供创建迭代器地方法


ConcreteAggregatelei:具体聚焦类,继承Aggregate类


Iterator:迭代抽象类,用于定义得到开始对象,得到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口。


ConcreteIterator类:具体的迭代器类,继承Iterator,实现其中的方法,可以在这儿修改实现不同的遍历方法。

二、特点

可以采用多种方式进行遍历

三、什么时候使用

当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历地时候,就应该考虑用迭代器模式

四、实例

①、迭代器实现

Iterator类(迭代器抽象类)

abstract class Iterator//用于定义得到开始对象,得到下一个对象、判断是否到结尾、当前随想等抽象方法统一接口
    {
        public abstract object First();
        public abstract object Next();
        public abstract bool  IsDone();
        public abstract object CurrentItem();
    }

Aggregate类(聚集抽象类)

abstract  class Aggregate
    {
        public abstract Iterator CreateIerator();//创建迭代器
    }

ConcreteIterator类(具体迭代器,继承Iterator)

 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()                   //判断时候遍历到末尾,到末尾返回true
        {
            return current >= aggregate.Count ?true :false;
        }
        public override object CurrentItem()
        {
            return aggregate[current];                      //返回当前聚焦对象
        }
    }

ConcreteAggregate类:(具体聚焦类,继承Aggregate)

class ConcreteAggregate:Aggregate 
    {
        private IList<object> items = new List<object>();               //声明一个Ilist泛型变量,用于存放聚合对象
        public override Iterator CreateIerator( )
        {
            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); }
        }
    }

类图关系



五、涉及知识点

1.关系

依赖:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。就好比动物依赖氧气和水。

实现:发生依赖关系的两个类都不会增加属性。其中一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已


图形:虚线+箭头



关联:对于两个独立的对象当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时 关系为关联关系。单向关联,双向


实现:发生关联关系的两个类,其中的一个类成为另一个类的属性


图形:实线+箭头

2.集合

1.ArrayList

是命名空间System.Collection下的一部分,它是使用大小可按需求动态增的的数组实线IList接口

ArrayList的容量是ArrayList可以保存的元素数。ArrayList的默认初始容量为0,随着元素添加到ArrayLIst中,容量会自动增加。

 

缺点:因为在ArrayLIst眼里所有元素都是object类型,,在使用元素的时候需要进行拆箱,胡进行大量计算。

3.泛型

泛型集合:首先泛型集合需要System.Collection.Generic的命名空间。List类是ArrayList类的泛型等效类。用法的关键就是在IList和list后面加<T>T是之指定集合或对象类型

 

通常情况下都建议使用泛型结合,不必对元素进行装箱。

目录
相关文章
|
5月前
|
设计模式 Java
Java设计模式【十七】:迭代器模式
Java设计模式【十七】:迭代器模式
52 0
|
5月前
|
设计模式
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
|
4天前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
3月前
|
存储 NoSQL Go
iLogtail设计模式问题之迭代器模式是如何应用的
iLogtail设计模式问题之迭代器模式是如何应用的
|
3月前
|
设计模式 移动开发 JavaScript
js设计模式【详解】—— 迭代器模式
js设计模式【详解】—— 迭代器模式
25 0
|
4月前
|
设计模式 Java
Java设计模式之迭代器模式详解
Java设计模式之迭代器模式详解
|
4月前
|
设计模式
迭代器模式-大话设计模式
迭代器模式-大话设计模式
|
4月前
|
设计模式 架构师 NoSQL
设计模式第六讲:责任链模式和迭代器模式详解
遍历任务交由迭代器完成,这简化了聚合类。  C. 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
162 0
|
5月前
|
设计模式 Go
[设计模式 Go实现] 行为型~迭代器模式
[设计模式 Go实现] 行为型~迭代器模式
|
5月前
|
设计模式 Java
23种设计模式,迭代器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第8天】迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露该对象的内部表示。它主要用于遍历集合对象(如列表、树等)。
44 9