zoukankan      html  css  js  c++  java
  • 第20章迭代器模式

    一 概念

    • 迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
    • 当你需要访问一个对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑使用迭代器模式。

    二 UML图

    • Iterator 迭代抽象类,用于定义得到开始对象,得到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口。
    • Aggregate 聚合的抽象类
    • ConcreteAggregate 具体聚合类,继承Aggregate
    • ConcreteIterator 具体迭代器类,继承Iterator,实现开始,下一个,是否结尾,当前对象等方法

    三 C++代码实现
    lesson1.h

    #ifndef LESSON1_H
    #define LESSON1_H
    #pragma once
    #include <iostream>
    #include <string>
    #include <list>
    #include <vector>
    using namespace std;
    
    class ConcreteAggregate;
    
    typedef string object;
    //迭代抽象类,用于定义得到开始对象,得到下一个对象,判断是否到结尾
    //当前对象等抽象方法,统一接口
    class Iterator
    {
    public:
    	virtual object First() = 0;
    	virtual object Next() = 0;
    	virtual object CurrentItem() = 0;
    	virtual bool IsDone() = 0;
    };
    //Aggregate聚集抽象类
    class Aggregate
    {
    public:
    	virtual Iterator* CreateIterator() = 0;
    	virtual Iterator* CreateIteratorDesc() = 0;
    	virtual vector<object>* GetVector() = 0;
    };
    
    //实现从前向后的迭代器
    class ConcreteIterator : public Iterator
    {
    public:
    	//初始化时将具体的聚合对象传入
    	ConcreteIterator(Aggregate* aggregate);
    	object First() override;
    	object Next() override;
    	object CurrentItem() override;
    	bool IsDone() override;
    private:
    	ConcreteAggregate* m_aggregate;  //定义了一个具体聚集对象
    	int current;
    };
    //实现从后向前的具体迭代器类
    class ConcreteIteratorDesc : public Iterator
    {
    public:
    	//初始化时将具体的聚合对象传入
    	ConcreteIteratorDesc(Aggregate* aggregate);
    	object First() override;
    	object Next() override;
    	object CurrentItem() override;
    	bool IsDone() override;
    private:
    	ConcreteAggregate* m_aggregate; 
    	int current;
    };
    
    //定义一个具体的聚合类
    class ConcreteAggregate : public Aggregate
    {
    public:
    	ConcreteAggregate();
    	~ConcreteAggregate();
    	Iterator* CreateIterator() override;
    	Iterator* CreateIteratorDesc() override;
    	int GetCount() const;
    	vector<object>* GetVector() override;
    	object GetElement(int index);
    private:
    	vector<object>* items;
    };
    #endif // LESSON1_H
    
    

    lesson1.cpp

    #include "lesson1.h"
    
    //初始化时将具体的聚合对象传入
    ConcreteIterator::ConcreteIterator(Aggregate* aggregate)
    {
    	this->m_aggregate = (ConcreteAggregate*)aggregate;
    	this->current = 0;
    }
    
    object ConcreteIterator::First()
    {
    	return this->m_aggregate->GetVector()->at(0);
    }
    
    object ConcreteIterator::Next()
    {
    	this->current++;
    	if (this->current < this->m_aggregate->GetCount())
    	{
    		return this->m_aggregate->GetVector()->at(this->current);
    	}
    }
    object ConcreteIterator::CurrentItem()
    {
    	return this->m_aggregate->GetVector()->at(this->current);
    }
    bool ConcreteIterator::IsDone()
    {
    	return this->current >= this->m_aggregate->GetVector()->size() ? true : false;
    }
    
    
    ConcreteAggregate::ConcreteAggregate()
    {
    	items = new vector<object>;
    }
    ConcreteAggregate::~ConcreteAggregate()
    {
    	delete items;
    }
    
    
    Iterator* ConcreteAggregate::CreateIterator()
    {
    	return new ConcreteIterator(this);
    }
    Iterator* ConcreteAggregate::CreateIteratorDesc()
    {
    	return new ConcreteIteratorDesc(this);
    }
    int ConcreteAggregate::GetCount() const
    {
    	return items->size();
    }
    vector<object>* ConcreteAggregate::GetVector()
    {
    	return this->items;
    }
    object ConcreteAggregate::GetElement(int index)
    {
    	return items->at(index);
    }
    
    ConcreteIteratorDesc::ConcreteIteratorDesc(Aggregate * aggregate)
    {
    	this->m_aggregate = (ConcreteAggregate*)aggregate;
    	this->current = this->m_aggregate->GetVector()->size() - 1;
    }
    
    object ConcreteIteratorDesc::First()
    {
    
    	return this->m_aggregate->GetVector()->at(this->m_aggregate->GetVector()->size() - 1);
    }
    
    object ConcreteIteratorDesc::Next()
    {
    	this->current--;
    	if (this->current >= 0)
    	{
    		return this->m_aggregate->GetVector()->at(this->current);
    	}
    }
    
    object ConcreteIteratorDesc::CurrentItem()
    {
    	return this->m_aggregate->GetVector()->at(this->current);
    }
    
    bool ConcreteIteratorDesc::IsDone()
    {
    	return this->current < 0 ? true : false;
    }
    
    

    ConsoleApplication1.cpp

    // ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include "pch.h"
    #include <iostream>
    #include "lesson1.h"
    using namespace std;
    
    int main()
    {
    	ConcreteAggregate* bus = new ConcreteAggregate();  //公交车对象
    	bus->GetVector()->push_back("大鸟");
    	bus->GetVector()->push_back("小菜");
    	bus->GetVector()->push_back("行李");
    	bus->GetVector()->push_back("老外");
    	bus->GetVector()->push_back("公交内部人员");
    	bus->GetVector()->push_back("小偷");
    
    	//产生从前向后的迭代器
    	Iterator* it1 = bus->CreateIterator();
    
    	while (!it1->IsDone())
    	{
    		cout << it1->CurrentItem() << " 请买车票" << endl;
    		it1->Next();
    	}
    
    	cout << "
    从后向前的遍历
    " << endl;
    
    	//产生从后向前的迭代器
    	Iterator* it2 = bus->CreateIteratorDesc();
    
    	while (!it2->IsDone())
    	{
    		cout << it2->CurrentItem() << "请买车票" << endl;
    		it2->Next();
    	}
    
    	return 0;
    }
    

    运行结果

    参考资料
    1 《大话设计模式C++实现-第20章-迭代器模式》https://blog.csdn.net/xiqingnian/article/details/42089611

  • 相关阅读:
    javaweb开发之解决全站乱码
    redis加入开机启动服务
    linux下安装memcache
    关于本地连接虚拟机(centos)里的mongodb失败问题
    oracle存储过程中返回一个程序集
    面向对象进阶(二)----------类的内置方法
    面向对象进阶(一)
    面向对象的三大特性之----------封装
    面向对象的三大特性之----------多态
    面向对象的三大特性之----------继承
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/11166245.html
Copyright © 2011-2022 走看看