C++设计模式浅识迭代器模式

迭代器模式:提供一中方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。【dp】

四个角色:

iterator迭代器抽象类: 用于定义得到开始对象,得到下一个对象、判断是否到结尾、当前对象等抽象方法,统一接口。

concreteiterator具体迭代器类: 继承iterator,实现具体开始对象、下一个对象等方法。

aggregate聚集抽象类: 创建迭代器

concreteaggregate具体聚集类

适用场合:

当你需要访问一个聚集对象,而且不管这些对象是什么,只需要遍历的时候。

需要对聚集有多种方式遍历时,如从前至后或从后至前。

为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的结构。 

测试用例:

[code]int main(){    ConcreteAggregate pa;    pa.Add("BigBird");    pa.Add("Pickles");    pa.Add("Luggage");    pa.Add("Foreigners");    pa.Add("InnerStaff");    pa.Add("Thief");    ConcreteIterator Itr(pa);    string temp = Itr.First();    while (!Itr.IsDone())    {        std::cout << Itr.currentItem() << ", ticket, Please\n";        Itr.Next();    }    return 0;}

迭代器模式实现:

[code]//迭代器模式#include #include #include using std::string;using std::deque;//MyIterator迭代器抽象类class MyIterator{public:    MyIterator(){}    //得到开始对象    virtual string First() = 0;    //得到下一个对象    virtual string  Next() = 0;    //判断是否到结尾    virtual bool IsDone() = 0;    //当前对象    virtual string currentItem() = 0;   };//抽象聚集类class Aggregate{public:    Aggregate(){}    //创建迭代器    virtual MyIterator* createIterator() = 0;private:    friend class MyIterator;};//具体聚集类class ConcreteAggregate: public Aggregate{public:    MyIterator* createIterator();    int Count();    void Add(string st);    string This(int index);private:    friend class ConcreteIterator;    //乘客队列    deque passengers;};//具体的迭代器类class ConcreteIterator: public MyIterator{public:    ConcreteIterator(ConcreteAggregate);    string First();    string Next();    bool IsDone();    string currentItem();private:    //以具体的聚集类为友元类    friend class ConcreteAggregate;    ConcreteAggregate aggregate;    int current = 0;  };//方法实现//具体迭代器类ConcreteIterator::ConcreteIterator(ConcreteAggregate cAgg): aggregate(cAgg), current(cAgg.passengers.size() - 1){}string ConcreteIterator::First(){    return  aggregate.This(0); }string ConcreteIterator::Next(){    string temp;    --current;    if(current >= 0)        temp = aggregate.This(current);    return temp;}string ConcreteIterator::currentItem(){    return aggregate.This(current);}bool ConcreteIterator::IsDone(){    return current >= 0 ? false : true;}//方法实现//具体聚集类MyIterator* ConcreteAggregate::createIterator(){    return (new ConcreteIterator(*this));}int ConcreteAggregate::Count(){    return passengers.size();}void ConcreteAggregate::Add(string st){    passengers.push_back(st);}string ConcreteAggregate::This(int index){    return passengers.at(index);}

总结:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合内部结构,又可让外部代码透明地访问集合内部的数据。

以上就是C++设计模式浅识迭代器模式的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1431927.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 05:55:43
下一篇 2025年12月13日 18:15:21

相关推荐

  • C++设计模式浅识外观模式

    外观模式(facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 两大角色: 外观类facade: 知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象。 子系统集合subsystem: 实现子系统的功能,处理facade对…

    好文分享 2025年12月17日
    000
  • C++设计模式浅识模板方法模式

    模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 适用的一个时机:当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。 模板方…

    2025年12月17日
    000
  • C++设计模式浅识原型模式

    定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。 原型模式主要考虑的深复制与浅复制,在c++++的类设计中,拷贝构造函数就是浅复制,当重载赋值运算符时就是深复制。 浅复制:被复制对象的所有变量…

    好文分享 2025年12月17日
    000
  • C++设计模式浅识工厂方法模式

    工厂方法模式(factory method):定义一个用于创建对象的接口,让子类去实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。 与简单工厂的区别:简单工厂需要修改原有类,违背了开闭原则。而工厂方法就避免类这个问题。保持了封装对象的创建过程的优点,只需增加工厂类就可以,解决了简单工厂分支判断…

    2025年12月17日
    000
  • C++设计模式浅识代理模式

    代理模式(proxy): 为其他对象提供一种代理以控制对这个对象(被代理者,即本人)的访问。  在c++#中实现方法是使用接口interface定义需要的方法,而在c++中需要实现一个类作为接口使用,其中定义需要的方法。这样对我话,本人并不需要参与其中的具体活动,而由代理人出面。客户端(第三方)也不…

    好文分享 2025年12月17日
    000
  • C++设计模式浅识简单工厂模式

    简单工厂定义: 实现一个工厂函数对其他操作类选择性的调用,实现用户的实际需求。  将需要的功能分成多个组件,可以减少代码的耦合性,提高代码复用。在以后对某个功能改需求时,只需局部修改,不至于牵一发而动全身,大大提高效率。  面向对象的设计思想是通过封装、继承、多态把程序的耦合度降低,而设计模式是对o…

    好文分享 2025年12月17日
    000
  • XML中如何生成XML报表模板_XML生成XML报表模板的方法与示例

    利用XSLT、编程语言或模板引擎可生成XML报表模板:1. XSLT将源XML转换为结构化报表;2. Python等语言通过DOM操作动态构建XML;3. Jinja2等模板引擎支持变量与逻辑控制,实现灵活输出。 在XML中生成XML报表模板,实际上是指利用XML的结构化特性设计一个可复用的数据模板…

    2025年12月17日
    000
  • XML中如何解压XML字符串_XML解压XML字符串的操作方法

    先解压再解析XML。C#用GZipStream解压字节流并转字符串,Java用GZIPInputStream或InflaterInputStream读取压缩数据,结合StreamReader或BufferedReader还原为明文XML后,交由XDocument或DocumentBuilder解析;…

    2025年12月17日
    000
  • 如何用XML表示时间序列数据

    XML通过层级结构和属性封装时间戳与数值,适合表示含丰富元数据和不规则采样的时间序列数据,便于跨系统交换;其优势在于自描述性、可扩展性和平台无关性,但存在冗余大、解析慢等问题,海量数据时不如二进制格式或专用数据库高效。 在XML中表示时间序列数据,核心在于利用其层级结构和属性来封装每个时间点的数据值…

    2025年12月17日
    000
  • XML中如何反序列化XML对象_XML反序列化XML对象的操作方法

    答案:C#和Java可通过XmlSerializer和JAXB实现XML反序列化,需定义匹配类并使用特性/注解映射字段,确保无参构造函数和正确命名空间,最终将XML数据转换为对象。 在处理XML数据时,反序列化是将XML格式的数据转换为程序中的对象的过程。这一操作广泛应用于配置读取、网络通信和数据存…

    2025年12月17日
    000
  • XML中如何反序列化XML为对象_XML反序列化XML为对象的操作方法

    答案:XML反序列化是将XML数据转换为程序对象的过程,C#使用XmlSerializer类,Java使用JAXB实现。需定义与XML结构匹配的类,添加相应特性或注解,确保无参构造函数存在,通过Deserialize或unmarshal方法完成转换,注意标签名匹配、命名空间和集合类型处理,避免解析失…

    2025年12月17日
    000
  • XML Schema数据类型有哪些

    XML Schema数据类型分为原子类型和派生类型,前者如string、boolean、dateTime等基础类型,后者通过限制或组合原子类型形成更具体类型,用于提升数据验证精度、语义清晰度和系统互操作性。 XML Schema定义了丰富的数据类型,它们主要可以归结为两大类:原子数据类型(primi…

    2025年12月17日
    000
  • XML中如何按节点顺序排序_XML按节点顺序排序的方法与步骤

    答案:处理XML节点排序常用XSLT和编程语言两种方法。使用XSLT时通过xsl:sort指令定义排序规则,并结合xsl:for-each或xpl:apply-templates实现节点重排;编程方式如Python的ElementTree可解析XML、提取节点并按标签、属性或文本内容排序,再保存结果…

    2025年12月17日
    000
  • XML中如何压缩XML内容_XML压缩XML内容的操作步骤

    XML压缩通过去除冗余、GZIP/ZIP压缩、二进制格式转换(如EXI)等方式减小体积;可借助工具自动化处理,适用于传输优化与存储节约。 在处理XML文件时,压缩XML内容可以减小文件体积,提高传输效率和存储利用率。实现XML压缩通常包括去除冗余信息、使用专用压缩算法等步骤。以下是具体操作方法。 1…

    2025年12月17日
    000
  • XML中如何生成带CDATA节点的XML_XML生成带CDATA节点的XML的方法

    答案:CDATA用于在XML中保留特殊字符原样输出,语法为,不同语言通过API如createCDATASection生成,避免解析器解析标签或实体。 在生成XML时,如果需要保留文本中的特殊字符(如 、& 等)原样输出而不被解析,可以使用CDATA(Character Data)节点。CDA…

    2025年12月17日
    000
  • XML中如何读取属性_XML读取属性的详细操作与示例

    答案:Python、JavaScript和C#均可通过内置库读取XML属性。Python使用ElementTree的get()方法获取book元素的id和category属性;JavaScript利用DOMParser解析后通过getAttribute()提取属性值;C#使用XmlDocument加…

    2025年12月17日
    000
  • XML中如何反序列化对象_XML反序列化XML对象的操作步骤

    答案:XML反序列化是将XML数据转换为程序对象的过程。1. 定义与XML结构匹配的类,属性名与元素名一致,使用特性或注解建立映射;2. 选用语言提供的反序列化工具,如C#的XmlSerializer或Java的JAXBContext读取XML并生成对象;3. 配置命名空间、嵌套结构等特殊格式处理;…

    2025年12月17日
    000
  • XML中如何合并多XML文档_XML合并多个XML文档的方法

    答案:合并XML文档常用方法包括XSLT转换、编程语言处理、命令行工具及专用软件。首先使用XSLT通过document()函数加载并整合多个XML;其次可用Python等语言解析ElementTree实现灵活合并;再者通过sed或xmllint脚本批量拼接简单结构文件;最后可借助Oxygen等可视化…

    2025年12月17日
    000
  • XML与Excel如何互转?常用方法有哪些?

    Excel转XML可通过内置功能导出或另存为XML表格文件;2. XML转Excel可直接打开或用Power Query导入;3. 编程可用Python、Java、C#实现批量处理;4. 在线工具适合小文件转换。应根据数据量、复杂度和自动化需求选择方法,确保结构清晰与字段正确映射。 XML与Exce…

    2025年12月17日
    000
  • XML中如何生成带CDATA节点的XML_XML生成带CDATA节点XML的方法与示例

    使用lxml、Java DOM和C# XmlDocument可生成带CDATA的XML,分别通过etree.CDATA、createCDATASection和CreateCDataSection方法实现,注意避免嵌套及编码问题。 在XML中,CDATA(Character Data)节点用于包裹文本…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信