迭代器模式
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式属于行为型模式。
介绍
意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决:不同的方式来遍历整个整合对象。
何时使用:遍历一个聚合对象。
如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
关键代码:定义接口:hasNext, next。
应用实例:JAVA 中的 iterator。
优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景: 1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。
注意事项:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
实现
我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口。实现了 Container 接口的实体类将负责实现 Iterator 接口。
IteratorPatternDemo,我们的演示类使用实体类 NamesRepository 来打印 NamesRepository 中存储为集合的 Names。
 
步骤 1
创建接口:
Iterator.java
Container.java
步骤 2
创建实现了 Container 接口的实体类。该类有实现了 Iterator 接口的内部类 NameIterator。
NameRepository.java
步骤 3
使用 NameRepository 来获取迭代器,并打印名字。
IteratorPatternDemo.java
步骤 4
执行程序,输出结果:
Name : Robert Name : John Name : Julie Name : Lora
 
       
不想加班的lily
155***3651@qq.com
StringArrayIterator 结合 headfirst 设计模式,发现上面的迭代器模式还可以扩展。
将 NameIterator 单独作为一个 public 类,专门针对 string[] 数据遍历的公共 类。
public class StringArrayIterator implements Iterator{ String[] args; int index = 0; public StringArrayIterator(String[] argTemp){ this.args = argsTemp; } @Override public boolean hasNext(){ if(index < args.length){ return true; } return false; } @Override public Object next(){ if(index < args.length){ return args[index++]; } return null; } } public class NameRepository implements Container { public String names[] = {"Robert" , "John" ,"Julie" , "Lora"}; @Override public Iterator getIterator() { return new StringArrayIterator(names); } }不想加班的lily
155***3651@qq.com
Siskin.xu
sis***@sohu.com
Python 方式:
# Iterator Pattern with Python Code from abc import abstractmethod,ABCMeta # 创建Iterator接口 class Iterator(metaclass=ABCMeta): @abstractmethod def hasNext(self): pass @abstractmethod def next(self): pass # 创建Container接口 class Container(metaclass=ABCMeta): @abstractmethod def getIterator(self): pass # 创建实现了Iterator接口的类NameIterator class NameIterator(Iterator): index = 0 aNameRepository = None def __init__(self, inNameRepository): self.aNameRepository = inNameRepository def hasNext(self): if self.index < len(self.aNameRepository.names): return True return False def next(self): if self.hasNext() : theName = self.aNameRepository.names[self.index] self.index += 1 return theName return None #创建实现了Container接口的实体类。 class NameRepository(Container): names = ["Robert","John","Julie","Lora"] def getIterator(self): return NameIterator(self) # 调用输出 if __name__ == '__main__': namesRespository = NameRepository() iter = namesRespository.getIterator() #print("Name : "+iter.aNameRepository.names[0]) while iter.hasNext(): strName = iter.next() print("Name : "+strName)Siskin.xu
sis***@sohu.com
王小黑
841***494@qq.com
C#方法:
using DesignPattern.ChainofResponsibilityPattern; using DesignPattern.IteratorPatttern; using DesignPattern.MementoPattern; using DesignPattern.ObserverPattern; using DesignPattern.VisitorPattern; using System; using System.Collections.Generic; namespace DesignPattern { internal class Program { static void Main(string[] args) { IteratorHelper(); } #region Pattern - Iterator static void IteratorHelper() { ObjectRepository<string> _stringRepository = new ObjectRepository<string>(); _stringRepository.AddObject("A"); _stringRepository.AddObject("B"); _stringRepository.AddObject("C"); _stringRepository.AddObject(11.ToString()); ObjectRepository<int> _intRepository = new ObjectRepository<int>(); _intRepository.AddObject(-1); _intRepository.AddObject(10); _intRepository.AddObject(20); _intRepository.AddObject(30); for (Iterator<string> _iterator = _stringRepository.GetIterator(); _iterator.HasNext();) { Console.WriteLine("Object is: " + _iterator.Next()); } Console.WriteLine("==================================================================="); for (Iterator<int> _iterator = _intRepository.GetIterator(); _iterator.HasNext();) { Console.WriteLine("Object is: " + _iterator.Next()); } Console.ReadLine(); #endregion } } } //======================================================================================================= namespace DesignPattern.IteratorPatttern { /// <summary> /// 迭代器 /// </summary> public interface Iterator<T> { bool HasNext(); T Next(); } /// <summary> /// 容器集装箱 /// </summary> public interface IContainer<T> { Iterator<T> GetIterator(); } /// <summary> /// 对象库 /// </summary> public class ObjectRepository<T> : IContainer<T> { ObjectIterator<T> m_ObjectIterator; public ObjectRepository() { m_ObjectIterator = new ObjectIterator<T>(); } public Iterator<T> GetIterator() { return m_ObjectIterator; } public void AddObject(T obj) { m_ObjectIterator.m_ObjectRepository.Add(obj); } /// <summary> /// 对象迭代器 /// </summary> class ObjectIterator<Tobjcet> : Iterator<Tobjcet> { public ObjectIterator() { m_ObjectRepository = new List<Tobjcet>(); } int index; public List<Tobjcet> m_ObjectRepository; public bool HasNext() { if (index < m_ObjectRepository.Count) { return true; } return false; } Tobjcet Iterator<Tobjcet>.Next() { if (HasNext()) { return m_ObjectRepository[index++]; } return default; } } } }王小黑
841***494@qq.com