迭代器模式

文章目录

  • 迭代器模式
    • 模式分类
    • 模式产生的原因
    • 模式的灵感来源
    • 模式类图
    • 代码实现
    • 迭代器模式总结
      • 迭代器模式的优点:
      • 迭代器模式的缺点:

本篇博客将介绍迭代器模式,迭代器模式将一个聚合对象保存数据的职责,和它遍历数据的职责分离,在引入迭代器后,聚合对象只负责保存数据,而遍历数据交给迭代器来完成。迭代器模式的介绍将参考.NET中的迭代器来进行说明。

模式分类

行为型设计模式。

模式产生的原因

在软件开发中,为了可以更加方便的操作聚合对象,同时可以很灵活的为聚合对象增加不同的遍历方法,我们需要一个解决方案可以让我们访问一个聚合对象但又不需要暴露它的内部结构。迭代器模式为我们解决了这个问题。它提供一种可以顺序访问一个聚合对象各个元素的方法且不会暴露该对象的内部表示。

模式的灵感来源

在现实生活中,人们有两种方法来操作电视机实现开机,关机,换台等操作。一种方法是使用电视机本身提供的操作面板上的按钮来说直接实现,另一种则是通过遥控器来间接控制电视机。遥控器的出现为电视机的操作带带来了极大的方便,用户并不需要知道电视机中是怎么存储频道的就可以实现换台。

模式类图

由图可知,迭代器模式由4个对象构成:

Aggregate(抽象聚合对象):

抽象聚合对象是所有的聚合对象的父类,它提供了一个获得迭代器的方法,在.NET中这个方法被封装在了另一个接口中,其实为了更加彻底的解耦,我们也可以采用.NET的方法,将GetIterator单独封装在一个接口中。

ConcreteAggregate(具体聚合对象):

具体的聚合对象,负责存储数据和获得迭代器,以方便遍历。

AbstractIterator(抽象迭代器):

抽象迭代器中有如何遍历聚合对象的基础方法,在具体迭代器中我们需要实现这些方法。

ConcreteIterator(具体迭代器):

具体迭代器负责实现抽象迭代器中的方法,并且要实现自己独有的遍历方法,一般我们可以在具体迭代器中书写当前迭代器的迭代逻辑。

代码实现

在代码实现里我使用了代理模式来延迟创建具体的迭代器,这样更加方便了实际使用的用户,但是加大了代码的书写逻辑。

抽象迭代器类:

using System.Collections.Generic;namespace Iterator.Iterator.Question3
{public abstract class MyIterator{protected List<int> MyList;protected int Index;public MyIterator(string name, List<int> list){MyList = list;}public abstract bool MoveNext();public abstract object Current();public abstract void Reset();}
}

获得迭代器接口:

namespace Iterator.Iterator.Question3
{public interface INewGetIterator{MyIterator GetIterator();}
}

迭代器代理类:

using System.Collections.Generic;
using System.Runtime.InteropServices;namespace Iterator.Iterator.Question3
{public class MCollectionAgent : MyIterator{private MyIterator _iterator;public MCollectionAgent(string name, List<int> list) : base(name, list){switch (name){case "AsOrder":_iterator = new AsOrder(name, list);break;case "DesOrder":_iterator = new DesOrder(name, list);break;}}public override bool MoveNext(){return _iterator.MoveNext();}public override object Current(){return _iterator.Current();}public override void Reset(){_iterator.Reset();}}
}

抽象聚合对象类:

using System.Collections.Generic;
using Iterator.Iterator.Example;namespace Iterator.Iterator.Question3
{public abstract class CollectionObject : INewGetIterator{protected List<int> MyList;public abstract MyIterator GetIterator();}
}

具体聚合对象A:

using System.Collections.Generic;namespace Iterator.Iterator.Question3
{public class CollectionA : CollectionObject{private string _name;public CollectionA(string name){_name = name;MyList = new List<int>(){1,2,3,4,5,6,7,8,9};}public override MyIterator GetIterator(){return new MCollectionAgent(_name, MyList);}}
}

升序遍历迭代器:

using System.Collections.Generic;namespace Iterator.Iterator.Question3
{public class AsOrder : MyIterator{public override bool MoveNext(){Index++;if (Index < MyList.Count){return true;}return false;}public override object Current(){return MyList[Index];}public override void Reset(){Index = -1;}public AsOrder(string name, List<int> list) : base(name,list){Index = -1;}}
}

降序遍历迭代器:

using System.Collections.Generic;namespace Iterator.Iterator.Question3
{public class DesOrder : MyIterator{public DesOrder(string name, List<int> list) : base(name, list){Index = MyList.Count;}public override bool MoveNext(){Index--;if (Index >= 0){return true;}return false;}public override object Current(){return MyList[Index];}public override void Reset(){Index = MyList.Count; }}
}

Program类:

using System;
using Iterator.Iterator.Question3;namespace Iterator
{internal class Program{public static void Main(string[] args){//降序遍历CollectionObject collectionObject = new CollectionA("DesOrder");MyIterator iterator = collectionObject.GetIterator();while (iterator.MoveNext()){Console.WriteLine(iterator.Current());}}}
}

迭代器模式总结

迭代器模式的优点:

  1. 迭代器模式支持以不同的方式遍历一个聚合对象,在同一个聚合对象中可以定义多种遍历方法。
  2. 迭代器简化了聚合对象,现在的聚合对象将不需要再考虑自己提供数据遍历的方法。

迭代器模式的缺点:

  1. 迭代器模式的使用会增加系统的复杂性。
  2. 迭代器模式的设计难度比较大,需要充分考虑系统将来的扩展。

C#设计模式之迭代器模式相关推荐

  1. 【GOF23设计模式】迭代器模式

    [GOF23设计模式]迭代器模式 来源:http://www.bjsxt.com/  一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 1 package com.test.it ...

  2. [转载] Python进阶:设计模式之迭代器模式

    参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...

  3. 每日学一个设计模式1——迭代器模式

    引言 精通设计模式是从码农脱颖而出的条件之一.跟着<图解设计模式>这本书学习设计模式,从今天开始,一天总结一个设计模式. 迭代器模式(一个一个遍历) 用处 隐藏遍历集合的内部结构,遍历不同 ...

  4. php迭代器实例,php设计模式之迭代器模式实例分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之迭代器模式.分享给大家供大家参考,具体如下: 星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿. 我们自然会 ...

  5. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 设计模式复习-迭代器模式

    Iterator.H #pragma once #include <list> #include <windows.h> using namespace std;/* 设计模式 ...

  7. php foreach 循环 判断index 小于多少_PHP设计模式之迭代器模式 - 硬核项目经理

    一说到这个模式,就不得不提循环语句.在<大话设计模式>中,作者说道这个模式现在的学习意义更大于实际意义,这是为什么呢?当然就是被foreach这货给整得.任何语言都有这种类似的语法可以方便 ...

  8. Java 设计模式之迭代器模式

    一.了解迭代器模式 1.1 什么是迭代器模式 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 迭代器模式把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和 ...

  9. 设计模式:迭代器模式(Iterator)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  10. Android设计模式之——迭代器模式

    一.介绍 迭代器模式(Iterator Pattern)又称为游标(Cursor)模式,是行为型设计模式之一.迭代器模式算是一个比较古老的设计模式,其源于对容器的访问,比如Java中的List.Map ...

最新文章

  1. KNN 最近邻算法(K近邻)
  2. Android怎么访问私有数据(5)
  3. hadoop部署单机
  4. DFS求连通块数目(深搜)
  5. 【译文】AppBarLayout的越界滚动行为
  6. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹
  7. 学生成绩管理系统设计报告python_python实现简易版学生成绩管理系统
  8. 使用Flex图表组件
  9. 为什么选择angular?-学习笔记
  10. 《零基础看得懂的C语言入门教程 》——(六)轻轻松松了解C语言的逻辑运算
  11. 算法—快速排序Sqrt (C语言)
  12. Nim游戏的一个扩展——51nod 1661 黑板上的游戏+LA 5059 Playing With Stones
  13. 原创 | 面试官问我同步容器(如Vector)的所有操作一定是线程安全的吗?我懵了!...
  14. 深度召回算法在字节跳动推荐系统的应用实践
  15. selenium 如何处理table
  16. python中的复数虚部_python复数的虚部怎么表达
  17. 99美金和299美金的开发者证书的区别
  18. 玩转WIN7的MKLINK
  19. 2022华为杯E题思路分析
  20. MTK OTA更新方法

热门文章

  1. 2019年吉林大学数学建模校内选拔赛B题的一种思路
  2. JAVA计算机毕业设计网上化妆品商城设计(附源码、数据库)
  3. 再生人造皮肤行业调研报告 - 市场现状分析与发展前景预测
  4. 《计算之魂》第1章 毫厘千里之差——大O概念
  5. Symbol的使用方法
  6. 让AI画画 | 大神复现OpenAI的Dall-E
  7. WPS Word中怎么打出拼音和声调让别人懂的这个字怎么读
  8. linux制作电脑启动盘,Linux启动盘的制作Linux -电脑资料
  9. Opencv-锐化增强算法(USM)
  10. 如何恢复ipad里面误删的视频,文字,图片?