目录

数据结构_Iterator


状态变化”模式

常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。 典型模式

  • Composite
  • Iterator
  • Chain of Resposibility

1 Iterator

迭代器的实现, 现在普遍用编译时多态, c++里是重载或者模版, java 里是泛型, python 里是 duck typing. 基于面相对象的实现可能现在是过时的, 但是这个模式的思想还是很重要的, 也是很多语言的基础.

1.1 模式动机

在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历“也为“同一种算法在多种集合对象上进行操作”提供了可能。

使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。

1.2 模式定义

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露(稳定)该对象的内部表示。

1.3 模式示例代码

# include <iostream>
# include <vector>

// 抽象迭代器类:迭代器
class Iterator {
public:
    virtual int next() = 0;
    virtual bool hasNext() = 0;
};

// 具体迭代器类:具体迭代器
class ConcreteIterator : public Iterator {
public:
    ConcreteIterator(const std::vector<int>& data) : data(data), index(0) {}

    int next() {
        return data[index++];
    }

    bool hasNext() {
        return index < data.size();
    }

private:
    std::vector<int> data;
    int index;
};

// 容器类:容器
class Container {
public:
    Iterator* createIterator() {
        return new ConcreteIterator(data);
    }

    void addElement(int element) {
        data.push_back(element);
    }

private:
    std::vector<int> data;
};

int main() {
    Container container;

    // 添加元素到容器
    container.addElement(1);
    container.addElement(2);
    container.addElement(3);

    // 创建迭代器
    Iterator* iterator = container.createIterator();

    // 遍历容器中的元素
    while (iterator->hasNext()) {
        std::cout << iterator->next() << std::endl;
    }

    // 释放内存(可选)
    delete iterator;

    return 0;
}

2 要点总结

迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。

迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。

迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构, 会导致问题。