设计模式笔记(18)---迭代器模式(行为型)
Gof定义
提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露该对象的内部表示。
动机
在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。
迭代器模式结构图:
Aggregate:集合结构接口
Iterator:迭代器接口
Concreteaggregate:集合结构的具体类,继承Aggregate接口
ConcreteIteator:具体的迭代器类
代码实现:
/// <summary> /// 集合结构接口 /// </summary> public interface Aggregate {Iterator CreateIterator(); } /// <summary> /// 迭代器接口 /// </summary> public interface Iterator {object First();object Next();bool IsDone();object CurrentItem(); } /// <summary> /// 集合结构的具体类 /// </summary> class ConcreteAggregate : Aggregate {private List<object> items = new List<object>();public 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); }} } /// <summary> /// 具体的迭代器类 /// </summary> class ConcreteIterator : Iterator {private ConcreteAggregate _aggregate;private int _current = 0;public ConcreteIterator(ConcreteAggregate aggregate){this._aggregate = aggregate;}public object First(){return _aggregate[0];}public object Next(){object r = null;_current++;if (_current < _aggregate.Count){r = _aggregate[_current];}return r;}public bool IsDone(){return _current >= _aggregate.Count ? true : false;}public object CurrentItem(){return _aggregate[_current];} } /// <summary> /// 客户端调用 /// </summary> class Program {static void Main(string[] args){ConcreteAggregate ca = new ConcreteAggregate();ca[0] = "AspNet3.5 揭秘";ca[0] = "重构:改善既有代码的设计";ca[2] = "设计模式";ca[3] = "人月神话";ca[4] = "代码大全2";Iterator i = new ConcreteIterator(ca);while (!i.IsDone()){Console.WriteLine("要读的书:" + i.CurrentItem());i.Next();}} }
上面的代码是根据结构图实现的基础代码,在设计的运用中可以使用Net框架给我们提供的相关接口IEnumerable和IEnumerator,这两个接口在Net中的实现代码如下:
public interface IEnumerable {IEmumerator GetEnumerator(); } public interface IEmumerator {Object Current { get; }bool MoveNext();void Reset(); }
在Net中List实现了IEnumerable接口,下面的代码将List作为数据的容器来实现遍历:
class Program {static void Main(string[] args){List<string> list = new List<string> { "AspNet3.5 揭秘","重构:改善既有代码的设计","设计模式","人月神话","代码大全2"};IEnumerator i = list.GetEnumerator();while (i.MoveNext()){Console.WriteLine("要读的书:" + i.Current);}} }
上面的代码中试调用List的GetEnumerator方法返回IEmumerator类型的集合,然后取遍历,这样仍然显得比较麻烦,其实在Net中foreach已经实现了这样的功能,代码如下:
class Program {static void Main(string[] args){List<string> list = new List<string> { "AspNet3.5 揭秘","重构:改善既有代码的设计","设计模式","人月神话","代码大全2"};foreach (string s in list){Console.WriteLine("要读的书:" + s);}} }
可以看出foreach其实就是实现了下面这段代码
IEnumerator i = list.GetEnumerator(); while (i.MoveNext()) {Console.WriteLine("要读的书:" + i.Current); }
Iterator模式的几个要点
- 迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。
迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。
出处:http://oec2003.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载于:https://www.cnblogs.com/abenmao/archive/2012/05/25/2518030.html
设计模式笔记(18)---迭代器模式(行为型)相关推荐
- 18.迭代器模式(行为型)
迭代器模式(行为型) 原书链接java设计模式(刘伟) 一.相关概念 在软件开发中,我们经常需要使用聚合对象来存储一系列数据.聚合对象拥有两个职责:一是存储数据:二是遍历数据.从依赖性来看,前者是聚合 ...
- 设计模式笔记 18. Observer 观察者模式(行为型模式)
18. Observer 观察者模式 2008-09-15 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系& ...
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用 ...
- 二、18【设计模式】之迭代器模式
今天的博客主题 设计模式 --> 设计模式之迭代器模式 命令模式 CP (Command Pattern) 定义 将一个请求封装成一个对象,使不同的请求把客户端参数化. 命令模式是对命令的 ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
- 《Android源码设计模式》之迭代器模式
迭代器模式介绍 迭代器模式(Iterator Pattern)又称为游标(Cursor) 模式,是行为型设计模式之一.我们对容器对象的访问必然会涉及遍历算法,如果我没将遍历方法封装到容器中,那么对于容 ...
- Java设计模式系列之——迭代器模式
本篇我们采取倒叙的手法来讲解迭代器模式,先看下面一段我们在平时工作中常见的代码: package com.mazhichu.designpatterns.iterator;import java.ut ...
- 设计模式:(迭代器模式)
1.定义 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为 ...
- 设计模式漫谈之迭代器模式
谈恋爱是两个人的事,结婚是两个家庭的事.最近事也挺多的.我也挺烦的,有时候,我也为自己的将来担忧,我自认为自己的技术过硬,但是千里马只有遇到伯乐才能发挥作用. 技术上让我高兴的事是,有个技术问题终于突 ...
最新文章
- 英特尔详解5G将如何助力VR的未来发展
- c#_String.Split 方法进阶篇
- 科大星云诗社动态20201227
- LeetCode 22 括号生成
- asp.net Login控件基本属性及事件说明
- RobotFramework系列(一):RIDE使用教程
- 详述一则DB2 Error Code 1639和SQL State 08001案例诊断和解决方案
- 【Elasticsearch】es FST (Finite State Tranduer) 有限状态转换器
- 软件设计师备考-软件设计师教程第五版
- Stata 中的向量自回归模型(VAR)
- vivo Z1的USB调试模式在哪里,打开vivo Z1USB调试模式的经验
- 德州大学奥斯汀分校计算机科学排名,德州大学奥斯汀分校专业排名一览及最强专业推荐(QS世界大学排名)...
- 密码1-分类,常用类型,密码分析
- 游戏本自动掉帧_玩游戏掉帧怎么办?
- statsmodels︱python常规统计模型库
- android 强制垃圾回收,Android垃圾回收(GC)
- radmi4a Android,红米4A(Redmi 4A 全网通)一键ROOT教程,看教程ROOT
- 常见Shell编程脚本
- C语言设计A与B的区别,C语言辅导 - abc与a=b=c的区别 and something else
- LeetCode(Python)—— 将有序数组转换为二叉搜索树(简单)