设计模式17――行为型模式之迭代器模式

2014-11-24 02:08:54 · 作者: · 浏览: 0

定义:迭代器模式(IteratorPattern),提供一种方法顺序访问一个聚合对象中各个元素,而又暴露无遗该对象的内部表示。

类型:对象行为型模式

概述:

正如定义所言,迭代器是为解决更好的访问一个聚合对象中的各个元素而产生的。迭代器是对象行为模式,也即它主要是通过将对象中的访问行为提取出来作为迭代器类。迭代器的产生,主要是为了解决客户端对聚合对象内部元素访问时可能造成的耦合。

为了使得迭代器能够访问更多的聚合对象,所以需要面向接口编程,即为迭代器和聚合对象分别提供统一接口。

C++中的STL库、C#,Java的泛型类型都有封装迭代器,所以下面的示例重点了解迭代器的工作原理。

举一个简单示例,有一个图书馆,存有许多图书。一天,有读者来借书,这个时候就可以使用迭代器模式了。迭代器将一系列图书的遍历查找定位等操作抽象出来形成一个迭代器类。

类图:

\

< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ss7T69Xfo7o8L3A+CjxvbCB0eXBlPQ=="1">

  • Client,生成具体的NationalLibrary以及具体的ConcreteIterator对象。
    1. Library,提供聚合对象的抽象接口。
      1. NationalLibrary,实现接口,并返回一个ConcreteIterator的对象。
        1. Iterator,迭代器接口类。
          1. ConcreteIterator,完成接口实现遍历查找。

            示例代码:

            using System;
            using System.Collections.Generic;
            using System.Text;
            
            namespace IteratorSpace
            {
                class Program
                {
                    abstract class Library
                    {
                        public abstract Iterator CreateIterator();
                    }
            
                    class NationalLibrary : Library
                    {
                        private IList items = new List(); 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); } } } abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool End(); public abstract object CurrentItem(); } class ConcreteIterator : Iterator { private NationalLibrary library; private int current = 0; public ConcreteIterator(NationalLibrary _library) { this.library = _library; } public override object First() { return library[0]; } public override object Next() { object ret = null; current++; if (current < library.Count) { ret = library[current]; } return ret; } public override object CurrentItem() { return library[current]; } public override bool End() { return current >= library.Count   true : false; } } static void Main(string[] args) { NationalLibrary library = new NationalLibrary(); library[0] = "C++ Primer"; library[1] = "C Program"; library[2] = "Design Pattern"; Iterator iter = new ConcreteIterator(library); while (!iter.End()) { Console.WriteLine("This book is {0}!", iter.CurrentItem()); iter.Next(); } } } }  

            适用性:

            1. 访问一个聚合对象的内容而无需暴露它的内部表示。
              1. 支持对聚合对象的多种遍历。
                1. 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)

                  优缺点:

                  1. 优点,简化遍历过程,降低客户端与聚合对象之间的耦合性。
                    1. 缺点,如果是简单聚合对象使用迭代器反倒复杂,另外新添聚合类以及迭代器类过多时,也会造成类过多而复杂

                      参考资料:

                      1. 《设计模式――可复用面向对象软件基础》
                      2. 《大话设计模式》
                      3. 《Head First设计模式》

                        <script type="text/java script">
                        <script type="text/java script">BAIDU_CLB_fillSlot("771048");
                        点击复制链接 与好友分享! 回本站首页
                        <script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
                        分享到: 更多
                        <script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)
                        您对本文章有什么意见或着疑问吗?请到 论坛讨论您的关注和建议是我们前行的参考和动力
                        上一篇: 经典算法题每日演练――第二十二题 奇偶排序
                        下一篇: 深入理解Java中为什么内部类可以访问外部类的成员
                        相关文章
                        <script type="text/java script">BAIDU_CLB_fillSlot("182716");
                        <script type="text/java script">BAIDU_CLB_fillSlot("517916");
                        图文推荐
                        <iframe src="http://www.2cto.com/uapi.php tid=281875&catid=85&title=yei8xsSjyr0xN6GqoarQ0M6q0M3Eo8q91q61/LT6xvfEo8q9&forward=http://www.2cto.com/kf/201402/281875.html" width="100%" height="100%" id="comment_iframe" name="comment_iframe" frameborder="0" scrolling="no">
                        <script type="text/java script">BAIDU_CLB_fillSlot("771057");
                        排行
                        热门
                        <script type="text/java script">BAIDU_CLB_fillSlot("406189");
                        <script type="text/java script">BAIDU_CLB_fillSlot("703749");
                        <iframe frameborder="0" name="Iframe1" src="http://www.2cto.com/bbsdy/index.html" width="100%" height="200"> 您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。
                        <script type="text/java script">BAIDU_CLB_fillSlot("182692");
                        文章
                        下载
                        读书
                        <script type="text/java script">BAIDU_CLB_fillSlot("771043");
                        <script type="text/java script"> <script language="java script" src="http://www.2cto.com/api.php op=count&id=281875&modelid=1"> <script type="text/java script">BAIDU_CLB_fillSlot("137946");
                        <script type="text/java script">BAIDU_CLB_fillSlot("333829");

                        关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
                        版权所有: 红黑联盟--致力于做最好的IT技术学习网站<script type="text/java script"> var _bdhmProtocol = (("https:" == document.location.protocol) " https://" : " http://"); document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F1898984a3d796e86ad73ad1f4bc9f240' type='text/java script'%3E%3C/script%3E"));