《设计模式迭代器模式.pptx》由会员分享,可在线阅读,更多相关《设计模式迭代器模式.pptx(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、大纲w迭代器模式概述w迭代器模式的结构与实现w迭代器模式的应用实例w使用内部类实现迭代器w.NET内置迭代器w迭代器模式的优缺点与适用环境遥控器第1页/共28页迭代器模式概述电视机遥控器与电视机示意图第2页/共28页迭代器模式概述分析电视机 存储电视频道的集合 聚合类(Aggregate Classes)电视机遥控器 操作电视频道 迭代器(Iterator)访问一个聚合对象中的元素但又不需要暴露它的内部结构第3页/共28页迭代器模式概述分析聚合对象的两个职责:存储数据存储数据,聚合对象的基本职责遍历数据遍历数据,既是可变化的,又是可分离的将遍历数据的行为从聚合对象中分离出来,封装在迭代器对象中
2、由迭代器来提供遍历聚合对象内部数据的行为,简化聚合对象的设计,更符合单一职责原则第4页/共28页迭代器模式概述迭代器模式的定义对象行为型模式迭迭代代器器模模式式:提供一种方法顺顺序序访访问问一一个个聚聚合合对对象象中中各各个个元素元素,且不用暴露该对象的内部表示不用暴露该对象的内部表示。Iterator Pattern:Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.第5页/共28页迭代器模式概述迭代器模
3、式的定义又名游标(Cursor)模式通过引入迭代器,客户端无须了解聚合对象的内部结构即可实现对聚合对象中成员的遍历,还可以根据需要很方便地增加新的遍历方式第6页/共28页迭代器模式的结构与实现迭代器模式的结构第7页/共28页迭代器模式的结构与实现迭代器模式的结构迭代器模式包含以下4个角色:Iterator(抽象迭代器)ConcreteIterator(具体迭代器)Aggregate(抽象聚合类)ConcreteAggregate(具体聚合类)第8页/共28页迭代器模式的结构与实现迭代器模式的实现典型的抽象迭代器代码:interface Iterator void First();/将游标指向第
4、一个元素 void Next();/将游标指向下一个元素 bool HasNext();/判断是否存在下一个元素 object CurrentItem();/获取游标指向的当前元素第9页/共28页迭代器模式的结构与实现迭代器模式的实现典型的具体迭代器代码:class ConcreteIterator:Iterator private ConcreteAggregate objects;/维维持持一一个个对对具具体体聚聚合合对对象象的的引引用用,以以便便于于访访问问存存储储在在聚聚合合对对象中的数据象中的数据 private int cursor;/定义一个游标,用于记录当前访问位置定义一个游标
5、,用于记录当前访问位置 public ConcreteIterator(ConcreteAggregate objects)this.objects=objects;public void First()/实现代码 public void Next()/实现代码 public bool HasNext()/实现代码 public object CurrentItem()/实现代码 第10页/共28页迭代器模式的结构与实现迭代器模式的实现典型的抽象聚合类代码:interface Aggregate Iterator CreateIterator();第11页/共28页迭代器模式的结构与实现迭代器
6、模式的实现典型的具体聚合类代码:class ConcreteAggregate:Aggregate .public Iterator CreateIterator()return new ConcreteIterator(this);.第12页/共28页迭代器模式的应用实例实例说明某软件公司为某商场开发了一套销售管理系统,在对该系统进行分析和设计时,开发人员发现经常需要对系统中的商品数据、客户数据等进行遍历,为了复用这些遍历代码,开发人员设计了一个抽象的数据集合类AbstractObjectList,将存储商品和客户等数据的类作为其子类,AbstractObjectList类结构如下图所示:A
7、bstractObjectList类结构图类结构图在图中,List类型的对象objects用于存储数据,其方法与说明如下表所示:AbstractObjectList类的方法与说明类的方法与说明AbstractObjectList类的子类ProductList和CustomerList分别用于存储商品数据和客户数据。通过分析,发现AbstractObjectList类的职责非常重,它既负责存储和管理数据,又负责遍历数据,违背了单一职责原则,实现代码将非常复杂。因此,开发人员决定使用迭代器模式对AbstractObjectList类进行重构,将负责遍历数据的方法提取出来,封装到专门的类中,实现数据
8、存储和数据遍历分离,还可以给不同的具体数据集合类提供不同的遍历方式。现给出使用迭代器模式重构后的解决方案。方法名方法名方法说明方法说明AbstractObjectList()构造方法,用于给objects对象赋值AddObject()增加元素RemoveObject()删除元素GetObjects()获取所有元素Next()移至下一个元素IsLast()判断当前元素是否是最后一个元素Previous()移至上一个元素IsFirst()判断当前元素是否是第一个元素GetNextItem()获取下一个元素GetPreviousItem()获取上一个元素第13页/共28页迭代器模式的应用实例实例类图
9、销售管理系统数据遍历结构图第14页/共28页迭代器模式的应用实例实例代码(1)AbstractObjectList:抽象聚合类(2)ProductList:商品数据类,充当具体聚合类(3)AbstractIterator:抽象迭代器(4)ProductIterator:商品迭代器,充当具体迭代器(5)Program:客户端测试类演示演示演示演示参考代码参考代码(DesignPatternIteratorSample)第15页/共28页迭代器模式的应用实例结果及分析如果需要增加一个新的具体聚合类,只需增加一个新的聚合子类和一个新的具体迭代器类即可,原有类库代码无须修改,符合开闭原则如果需要更换一
10、个迭代器,只需要增加一个新的具体迭代器类作为抽象迭代器类的子类,重新实现遍历方法即可,原有迭代器代码无须修改,也符合开闭原则如果要在迭代器中增加新的方法,则需要修改抽象迭代器的源代码,这将违背开闭原则第16页/共28页使用内部类实现迭代器实现/ProductListNew.cs 使用内部类实现的商品数据类using System.Collections.Generic;namespace IteratorSample class ProductListNew:AbstractObjectList public ProductListNew(List products):base(product
11、s)public override AbstractIterator CreateIterator()return new ProductIterator();/商品迭代器:具体迭代器,内部类实现商品迭代器:具体迭代器,内部类实现 private class ProductIterator:AbstractIterator /迭代器实现代码 第17页/共28页.NET内置迭代器枚举接口:System.Collections.IEnumerablepublic interface IEnumerable IEnumerator GetEnumerator();/工厂方法,获取迭代器对象第18页/
12、共28页.NET内置迭代器抽象的迭代器接口:System.Collections.IEnumeratorpublic interface IEnumerator object Current get;/返回当前集合中的元素bool MoveNext();/遍历集合,移至下一个元素void Reset();/恢复初始位置 第19页/共28页.NET内置迭代器分析ICollection继承自IEnumerable,IList继承自ICollection,而ArrayList是IList的子类,实现了GetEnumerator()方法,并返回一个ArrayListEnumeratorSimple类型
13、的对象public class ArrayList:IList,ICloneablepublic virtual IEnumerator GetEnumerator()return new ArrayListEnumeratorSimple(this);.Serializableprivate class ArrayListEnumeratorSimple:IEnumerator,ICloneable /Methods internal ArrayListEnumeratorSimple(ArrayList list)this.list=list;this.index=-1;this.vers
14、ion=list._version;this.currentElement=list;public object Clone()/实现略 public virtual bool MoveNext()/实现略 public virtual void Reset()/实现略 public virtual object Current/实现略 /Fields private object currentElement;private int index;private ArrayList list;private int version;第20页/共28页.NET内置迭代器分析IEnumerable
15、 抽象聚合类IEnumerator 抽象迭代器ArrayList 具体聚合类ArrayListEnumeratorSimple 具体迭代器第21页/共28页.NET内置迭代器应用实例using System;using System.Collections;namespace IteratorSample class Program static void Process(IEnumerable e)IEnumerator i=e.GetEnumerator();/创建迭代器对象创建迭代器对象 while(i.MoveNext()Console.WriteLine(i.Current.ToSt
16、ring();static void Main(string args)IList persons;persons=new ArrayList();/创建一个ArrayList类型的聚合对象 persons.Add(张无忌);persons.Add(小龙女);persons.Add(令狐冲);persons.Add(韦小宝);persons.Add(袁紫衣);persons.Add(小龙女);Process(persons);Console.Read();张无忌小龙女令狐冲韦小宝袁紫衣小龙女第22页/共28页迭代器模式的优缺点与适用环境模式优点支持以不同的方式遍历一个聚合对象,在同一个聚合对象
17、上可以定义多种遍历方式简化了聚合类由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,符合开闭原则第23页/共28页迭代器模式的优缺点与适用环境模式缺点在增加新的聚合类时需要对应地增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展。在自定义迭代器时,创建一个考虑全面的抽象迭代器并不是一件很容易的事情第24页/共28页迭代器模式的优缺点与适用环境模式适用环境访问一个聚合对象的内容而无须暴露它的内部表示需要为一个聚合对象提供多种遍历方式为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合结构提供不同的遍历方式,而客户端可以一致性地操作该接口第25页/共28页思考扩展.NET中的ArrayList类,自定义一个ReverseArrayList类,要求实现逆向遍历这个类的内部元素。第26页/共28页ENDENDENDEND第27页/共28页感谢您的观看!第28页/共28页
限制150内