自学内容网 自学内容网

10.迭代器模式

一、应用场景

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

二、通用类图

在这里插入图片描述

  • ConcreteAggregate:具体的集合对象类
  • ConcreteIterator:迭代器对象

三、实现

3.1 类图

  • 以电视机和遥控器为场景进行设计
    在这里插入图片描述

3.2 代码实现

#include <iostream>
#include <vector>

class Item;

class Iterator
{
public:
    virtual Item* first() = 0;
    virtual Item* next() = 0;
    virtual bool isDone() = 0;
    virtual Item* currentItem() = 0;
};

class Item
{
private:
    std::string name;

public:
    Item(const std::string& name)
    {
        this->name = name;
    }

    std::string getName()
    {
        return name;
    }
};

class ITelevision
{
public:
    virtual Iterator* createIterator() = 0;
    virtual std::vector<Item*> getChannel() = 0;
};

class Controller : public Iterator
{
private:
    unsigned int current = 0;
    std::vector<Item*> channel;

public:
    Controller(std::vector<Item*> channel)
    {
        this->channel = channel;
    }

    Item* first()
    {
        return channel[0];
    }

    Item* next()
    {
        current++;
        return channel[current];
    }

    Item* currentItem()
    {
        return channel[current];
    }

    bool isDone()
    {
        return current >= channel.size() - 1;
    }
};

class HaierTV : public ITelevision
{
private:
    std::vector<Item*> channel;
 
public:
    HaierTV()
    {
        channel.push_back(new Item("channel 1"));
        channel.push_back(new Item("channel 2"));
        channel.push_back(new Item("channel 3"));
        channel.push_back(new Item("channel 4"));
        channel.push_back(new Item("channel 5"));
        channel.push_back(new Item("channel 6"));
        channel.push_back(new Item("channel 7"));
    }

    std::vector<Item*> getChannel()
    {
        return channel;
    }

    Iterator* createIterator()
    {
        return new Controller(channel);
    }
    
};
int main()
{
    ITelevision* tv = new HaierTV();

    Iterator* it = tv->createIterator();
    std::cout << it->first()->getName() << std::endl;

    while (!it->isDone()) {
        std::cout << it->next()->getName() << std::endl;
    }
    return 0;
}

原文地址:https://blog.csdn.net/wzj_sxpi/article/details/149693448

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!