第15章 迭代器模式(Iterator Pattern)
原文 第15章 迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern)
概述:
在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。[GOF 《设计模式》]
结构图:

简单示例:可能中间对象引用的地方有点绕,但是写得很精髓
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
 | 
 /// <summary>    /// 抽象迭代器    /// </summary>    public interface Iterator    {        object GetCurrentItem();//当前项        bool MoveNext();//是否遍历完        void Next();//下一个    }    /// <summary>    /// 具体迭代器    /// </summary>    public class ConcreteTerator : Iterator    {        public ConcreteList list;        int index = 0;        public ConcreteTerator(ConcreteList list)        {            this.list = list;        }        public bool MoveNext()        {            if (index < list.Length)            {                return true;            }            else            {                return false;            }        }        public object GetCurrentItem()        {           return list.GetItem(index);        }        public void Next()        {            index++;        }    }    /// <summary>    /// 抽象聚集类    /// </summary>    public interface IList    {        //获取迭代器        Iterator GetTerator();    }    /// <summary>    /// 具体聚集类    /// </summary>    public class ConcreteList : IList    {        //这里就假设个Int数组对象        public int[] list        {            get;            set;        }        public int Length        {            get            {                return list.Length;            }        }        public object GetItem(int i)        {          return  list[i];        }        public Iterator GetTerator()        {            //把本身传入到迭代器            return new ConcreteTerator(this);        }    }         //client    class Program    {        static void Main(string[] args)        {            ConcreteList list = new ConcreteList();            list.list = new int[5] { 1, 2, 3, 4, 5 };            Iterator terator = list.GetTerator();            while (terator.MoveNext())            {                Console.WriteLine(terator.GetCurrentItem());                terator.Next();            }            Console.ReadLine();        }    } | 
效果:
1.迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。
2.迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
3.迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。
适用场景:
1.访问一个聚合对象的内容而无需暴露它的内部表示。
2.支持对聚合对象的多种遍历。
3.为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。
第15章 迭代器模式(Iterator Pattern)的更多相关文章
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
		
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
 - 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
		
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
 - 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
		
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
 - 二十四种设计模式:迭代器模式(Iterator Pattern)
		
迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...
 - 设计模式 - 迭代器模式(iterator pattern) 具体解释
		
迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...
 - 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素
		
模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...
 - C#设计模式——迭代器模式(Iterator Pattern)
		
一.概述在软件开发过程中,我们可能会希望在不暴露一个集合对象内部结构的同时,可以让外部代码透明地访问其中包含的元素.迭代器模式可以解决这一问题.二.迭代器模式迭代器模式提供一种方法顺序访问一个集合对象 ...
 - 迭代器模式(Iterator Pattern)
		
迭代器模式定义:Iterator Pattern提供一种方法顺序访问一个聚合元素中的各个元素,而又不暴漏内部方法 酒吧提供beer和wine: public class Bar { private L ...
 - 16.迭代器模式(Iterator Pattern)
		
using System; namespace ConsoleApplication9 { class Program { /// <summary> /// 迭代器模式提供了一种方法顺序 ...
 
随机推荐
- 用golang写的 分解x86 intel boot/recovery工具
			
源代码地址: https://github.com/sndnvaps/pack-unpack-intel
 - spring mvc综合easyui点击上面菜单栏中的菜单项问题
			
采用easyui的tree报错发生的背景后,会弹出一个窗口,有一个问题是,当你点击顶部 解决方案,如下面(运用easyui1.36): /home/cyz/workspace/hb_manager ...
 - UVA - 12338 Anti-Rhyme Pairs (哈希)
			
Description D Anti-Rhyme Pairs Input: Standard Input Output: Standard Output Often two words that rh ...
 - lunux命令笔记
			
文件查看命令 ls / -lh ls list / 路径 -l 具体 -lh 具体的人性化显示 -ld 显示文件夹 -i 显示i节点 mkdir /tmp/mulu/mulu2 /tmp/ma/mb ...
 - Linux 下一个 Mysql error 2002 错误解决
			
Linux 下一个 Mysql error 2002 错误解决 首先查看 /etc/rc.d/init.d/mysqld status 查看mysql它已开始. 假设启动的的话,先将数 ...
 - 高榕资本宾悦:未使用的企业家Testin云测试服务类故障
			
高榕资本岳斌:创业者未使用Testin云測试服务属不合格 2014/10/09 · Testin · 开发人员訪谈 Testin云測与工信部等联合承办的ICT中国.2014高层论坛之移动开发人员分论坛 ...
 - 最简单的视音频播放演示样例8:DirectSound播放PCM
			
===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...
 - Windows8和Windows Phone应用开发主题编码汇总
			
原文:Windows8和Windows Phone应用开发主题编码汇总 在Windows 8和Windows Phone应用开发中经常需要自定义一些Windows Store应用风格主题,下面列举一些 ...
 - Swift1_关闭
			
// main.swift // swift1_关闭 // Created by beyond on 15/6/12. // Copyright (c) 2015年 beyond.com All ri ...
 - 玩转Web之servlet(二)---servlet常见错误
			
1>403:tomcat发生错误 2> 404 :意思是服务器依据请求资源路径,找不到对应的资源 解决:1.依据http://localhost:8080/Web工程名/ur ...