第十七章:遍历万象,步步为营——Iterator的迭代艺术

第十七章:遍历万象,步步为营------Iterator的迭代艺术

风云再起,迭代游侠登场

在Template Method展示完他那精妙的模板艺术后,Iterator动作流畅、步履轻盈地走出。他的步伐如同行云流水,仿佛能够轻松穿越任何复杂的数据结构。

"Template Method兄的算法骨架确实精妙,"Iterator优雅地说道,"但在集合遍历和元素访问方面,需要更加统一和优雅的方式。诸位请看------"

Iterator身形一晃,瞬间在几个不同的数据结构间穿梭:"我的迭代器模式,专为解决集合遍历的统一访问问题而生!我提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表示!"

架构老人眼中闪过赞许之色:"善!Iterator,就请你为大家展示这迭代艺术的精妙所在。"

迭代器模式的核心要义

Iterator面向众人,开始阐述他的武学真谛:

"在我的迭代器模式中,主要包含四个核心角色:"

"Iterator(迭代器):定义访问和遍历元素的接口。"

"ConcreteIterator(具体迭代器):实现迭代器接口,跟踪遍历的当前位置。"

"Aggregate(聚合):定义创建相应迭代器对象的接口。"

"ConcreteAggregate(具体聚合):实现创建相应迭代器的接口,返回具体迭代器的实例。"

"其精妙之处在于,"Iterator继续道,"我将集合的遍历行为抽象出来,使得客户端无需了解集合的内部结构。这样,我们可以用相同的方式遍历不同的集合,甚至支持多种遍历方式!"

C++实战:多媒体库管理系统

"且让我以一个多媒体库管理系统为例,展示迭代器模式的实战应用。"Iterator说着,手中凝聚出一道道代码流光。

基础框架搭建

首先,Iterator定义了迭代器接口:

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
#include <memory>
#include <algorithm>
#include <map>
#include <iomanip>
#include <sstream>
#include <random>
#include <thread>
#include <chrono>
#include <list>
#include <set>

// 迭代器接口
template<typename T>
class Iterator {
public:
    virtual ~Iterator() = default;
    
    // 重置到第一个元素
    virtual void first() = 0;
    
    // 移动到下一个元素
    virtual void next() = 0;
    
    // 检查是否还有更多元素
    virtual bool isDone() const = 0;
    
    // 获取当前元素
    virtual T currentItem() const = 0;
    
    // 获取当前位置
    virtual int currentPosition() const = 0;
    
    // 便利方法:遍历所有元素
    virtual void traverse(std::function<void(const T&)> visitor) {
        for (first(); !isDone(); next()) {
            visitor(currentItem());
        }
    }
};

// 聚合接口
template<typename T>
class Aggregate {
public:
    virtual ~Aggregate() = default;
    virtual std::unique_ptr<Iterator<T>> createIterator() = 0;
    virtual std::unique_ptr<Iterator<T>> createReverseIterator() = 0;
    virtual int size() const = 0;
    virtual bool isEmpty() const = 0;
};

具体聚合和迭代器实现

Iterator展示了各种数据结构的迭代器实现:

cpp 复制代码
// 具体聚合:数组集合
template<typename T>
class ArrayCollection : public Aggregate<T> {
private:
    std::vector<T> items_;
    std::string name_;
    
public:
    ArrayCollection(const std::string& name = "数组集合") : name_(name) {
        std::cout << "📚 创建数组集合: " << name_ << std::endl;
    }
    
    void add(const T& item) {
        items_.push_back(item);
    }
    
    T& operator[](int index) {
        return items_[index];
    }
    
    const T& operator[](int index) const {
        return items_[index];
    }
    
    std::unique_ptr<Iterator<T>> createIterator() override {
        return std::make_unique<ArrayIterator<T>>(this);
    }
    
    std::unique_ptr<Iterator<T>> createReverseIterator() override {
        return std::make_unique<ReverseArrayIterator<T>>(this);
    }
    
    int size() const override {
        return items_.size();
    }
    
    bool isEmpty() const override {
        return items_.empty();
    }
    
    std::string getName() const {
        return name_;
    }
    
    // 数组集合特有的方法
    void sort() {
        std::sort(items_.begin(), items_.end());
        std::cout << "🔢 对集合 " << name_ << " 进行排序" << std::endl;
    }
    
    void clear() {
        items_.clear();
        std::cout << "🧹 清空集合 " << name_ << std::endl;
    }

private:
    // 具体迭代器:数组迭代器
    class ArrayIterator : public Iterator<T> {
    private:
        const ArrayCollection<T>* collection_;
        int currentIndex_;
        
    public:
        ArrayIterator(const ArrayCollection<T>* collection) 
            : collection_(collection), currentIndex_(0) {
            std::cout << "   🔄 创建数组迭代器" << std::endl;
        }
        
        void first() override {
            currentIndex_ = 0;
        }
        
        void next() override {
            if (!isDone()) {
                currentIndex_++;
            }
        }
        
        bool isDone() const override {
            return currentIndex_ >= collection_->size();
        }
        
        T currentItem() const override {
            if (isDone()) {
                throw std::out_of_range("迭代器已到达末尾");
            }
            return (*collection_)[currentIndex_];
        }
        
        int currentPosition() const override {
            return currentIndex_;
        }
    };
    
    // 具体迭代器:反向数组迭代器
    class ReverseArrayIterator : public Iterator<T> {
    private:
        const ArrayCollection<T>* collection_;
        int currentIndex_;
        
    public:
        ReverseArrayIterator(const ArrayCollection<T>* collection) 
            : collection_(collection), currentIndex_(collection->size() - 1) {
            std::cout << "   🔄 创建反向数组迭代器" << std::endl;
        }
        
        void first() override {
            currentIndex_ = collection_->size() - 1;
        }
        
        void next() override {
            if (!isDone()) {
                currentIndex_--;
            }
        }
        
        bool isDone() const override {
            return currentIndex_ < 0;
        }
        
        T currentItem() const override {
            if (isDone()) {
                throw std::out_of_range("迭代器已到达开头");
            }
            return (*collection_)[currentIndex_];
        }
        
        int currentPosition() const override {
            return currentIndex_;
        }
    };
};

// 具体聚合:链表集合
template<typename T>
class LinkedListCollection : public Aggregate<T> {
private:
    std::list<T> items_;
    std::string name_;
    
public:
    LinkedListCollection(const std::string& name = "链表集合") : name_(name) {
        std::cout << "🔗 创建链表集合: " << name_ << std::endl;
    }
    
    void add(const T& item) {
        items_.push_back(item);
    }
    
    void addFront(const T& item) {
        items_.push_front(item);
    }
    
    std::unique_ptr<Iterator<T>> createIterator() override {
        return std::make_unique<LinkedListIterator<T>>(this);
    }
    
    std::unique_ptr<Iterator<T>> createReverseIterator() override {
        return std::make_unique<ReverseLinkedListIterator<T>>(this);
    }
    
    int size() const override {
        return items_.size();
    }
    
    bool isEmpty() const override {
        return items_.empty();
    }
    
    std::string getName() const {
        return name_;
    }

private:
    // 具体迭代器:链表迭代器
    class LinkedListIterator : public Iterator<T> {
    private:
        const LinkedListCollection<T>* collection_;
        typename std::list<T>::const_iterator current_;
        
    public:
        LinkedListIterator(const LinkedListCollection<T>* collection) 
            : collection_(collection), current_(collection->items_.begin()) {
            std::cout << "   🔄 创建链表迭代器" << std::endl;
        }
        
        void first() override {
            current_ = collection_->items_.begin();
        }
        
        void next() override {
            if (!isDone()) {
                ++current_;
            }
        }
        
        bool isDone() const override {
            return current_ == collection_->items_.end();
        }
        
        T currentItem() const override {
            if (isDone()) {
                throw std::out_of_range("迭代器已到达末尾");
            }
            return *current_;
        }
        
        int currentPosition() const override {
            // 链表没有索引,返回近似位置
            return std::distance(collection_->items_.begin(), current_);
        }
    };
    
    // 具体迭代器:反向链表迭代器
    class ReverseLinkedListIterator : public Iterator<T> {
    private:
        const LinkedListCollection<T>* collection_;
        typename std::list<T>::const_reverse_iterator current_;
        
    public:
        ReverseLinkedListIterator(const LinkedListCollection<T>* collection) 
            : collection_(collection), current_(collection->items_.rbegin()) {
            std::cout << "   🔄 创建反向链表迭代器" << std::endl;
        }
        
        void first() override {
            current_ = collection_->items_.rbegin();
        }
        
        void next() override {
            if (!isDone()) {
                ++current_;
            }
        }
        
        bool isDone() const override {
            return current_ == collection_->items_.rend();
        }
        
        T currentItem() const override {
            if (isDone()) {
                throw std::out_of_range("迭代器已到达开头");
            }
            return *current_;
        }
        
        int currentPosition() const override {
            // 反向位置计算
            return collection_->items_.size() - 1 - 
                   std::distance(collection_->items_.rbegin(), current_);
        }
    };
};

// 具体聚合:集合(不允许重复)
template<typename T>
class SetCollection : public Aggregate<T> {
private:
    std::set<T> items_;
    std::string name_;
    
public:
    SetCollection(const std::string& name = "集合") : name_(name) {
        std::cout << "🔄 创建集合: " << name_ << std::endl;
    }
    
    void add(const T& item) {
        items_.insert(item);
    }
    
    std::unique_ptr<Iterator<T>> createIterator() override {
        return std::make_unique<SetIterator<T>>(this);
    }
    
    std::unique_ptr<Iterator<T>> createReverseIterator() override {
        return std::make_unique<ReverseSetIterator<T>>(this);
    }
    
    int size() const override {
        return items_.size();
    }
    
    bool isEmpty() const override {
        return items_.empty();
    }
    
    std::string getName() const {
        return name_;
    }
    
    // 集合特有的方法
    bool contains(const T& item) const {
        return items_.find(item) != items_.end();
    }
    
    void remove(const T& item) {
        items_.erase(item);
        std::cout << "🗑️  从集合 " << name_ << " 中移除元素" << std::endl;
    }

private:
    // 具体迭代器:集合迭代器
    class SetIterator : public Iterator<T> {
    private:
        const SetCollection<T>* collection_;
        typename std::set<T>::const_iterator current_;
        
    public:
        SetIterator(const SetCollection<T>* collection) 
            : collection_(collection), current_(collection->items_.begin()) {
            std::cout << "   🔄 创建集合迭代器" << std::endl;
        }
        
        void first() override {
            current_ = collection_->items_.begin();
        }
        
        void next() override {
            if (!isDone()) {
                ++current_;
            }
        }
        
        bool isDone() const override {
            return current_ == collection_->items_.end();
        }
        
        T currentItem() const override {
            if (isDone()) {
                throw std::out_of_range("迭代器已到达末尾");
            }
            return *current_;
        }
        
        int currentPosition() const override {
            return std::distance(collection_->items_.begin(), current_);
        }
    };
    
    // 具体迭代器:反向集合迭代器
    class ReverseSetIterator : public Iterator<T> {
    private:
        const SetCollection<T>* collection_;
        typename std::set<T>::const_reverse_iterator current_;
        
    public:
        ReverseSetIterator(const SetCollection<T>* collection) 
            : collection_(collection), current_(collection->items_.rbegin()) {
            std::cout << "   🔄 创建反向集合迭代器" << std::endl;
        }
        
        void first() override {
            current_ = collection_->items_.rbegin();
        }
        
        void next() override {
            if (!isDone()) {
                ++current_;
            }
        }
        
        bool isDone() const override {
            return current_ == collection_->items_.rend();
        }
        
        T currentItem() const override {
            if (isDone()) {
                throw std::out_of_range("迭代器已到达开头");
            }
            return *current_;
        }
        
        int currentPosition() const override {
            return collection_->items_.size() - 1 - 
                   std::distance(collection_->items_.rbegin(), current_);
        }
    };
};

UML 武功秘籍图

creates creates <<interface>> Iterator<T> +first() : void +next() : void +isDone() : bool +currentItem() : T +currentPosition() : int +traverse(function<void(const T&)>) : void <<interface>> Aggregate<T> +createIterator() +createReverseIterator() +size() : int +isEmpty() : bool ArrayCollection<T> -vector<T> items_ -string name_ +add(T) : void +operator[](int) +createIterator() +createReverseIterator() +size() : int +isEmpty() : bool +sort() : void +clear() : void ArrayIterator<T> -const ArrayCollection<T>* collection_ -int currentIndex_ +first() : void +next() : void +isDone() : bool +currentItem() : T +currentPosition() : int LinkedListCollection<T> -list<T> items_ -string name_ +add(T) : void +addFront(T) : void +createIterator() +createReverseIterator() +size() : int +isEmpty() : bool LinkedListIterator<T> -const LinkedListCollection<T>* collection_ -list<T>::const_iterator current_ +first() : void +next() : void +isDone() : bool +currentItem() : T +currentPosition() : int

实战演练:高级迭代系统

Iterator继续展示更复杂的迭代器模式应用:

cpp 复制代码
// 过滤迭代器:基于条件的元素过滤
template<typename T>
class FilterIterator : public Iterator<T> {
private:
    std::unique_ptr<Iterator<T>> baseIterator_;
    std::function<bool(const T&)> predicate_;
    T currentItem_;
    bool isValid_;
    
public:
    FilterIterator(std::unique_ptr<Iterator<T>> baseIterator, 
                   std::function<bool(const T&)> predicate)
        : baseIterator_(std::move(baseIterator)), predicate_(predicate) {
        std::cout << "🎯 创建过滤迭代器" << std::endl;
        findNextValid();
    }
    
    void first() override {
        baseIterator_->first();
        findNextValid();
    }
    
    void next() override {
        if (!isDone()) {
            baseIterator_->next();
            findNextValid();
        }
    }
    
    bool isDone() const override {
        return !isValid_;
    }
    
    T currentItem() const override {
        if (isDone()) {
            throw std::out_of_range("迭代器已到达末尾");
        }
        return currentItem_;
    }
    
    int currentPosition() const override {
        return baseIterator_->currentPosition();
    }
    
private:
    void findNextValid() {
        isValid_ = false;
        while (!baseIterator_->isDone()) {
            T item = baseIterator_->currentItem();
            if (predicate_(item)) {
                currentItem_ = item;
                isValid_ = true;
                break;
            }
            baseIterator_->next();
        }
    }
};

// 转换迭代器:对元素进行转换
template<typename T, typename U>
class TransformIterator : public Iterator<U> {
private:
    std::unique_ptr<Iterator<T>> baseIterator_;
    std::function<U(const T&)> transformer_;
    
public:
    TransformIterator(std::unique_ptr<Iterator<T>> baseIterator, 
                      std::function<U(const T&)> transformer)
        : baseIterator_(std::move(baseIterator)), transformer_(transformer) {
        std::cout << "🔄 创建转换迭代器" << std::endl;
    }
    
    void first() override {
        baseIterator_->first();
    }
    
    void next() override {
        baseIterator_->next();
    }
    
    bool isDone() const override {
        return baseIterator_->isDone();
    }
    
    U currentItem() const override {
        if (isDone()) {
            throw std::out_of_range("迭代器已到达末尾");
        }
        return transformer_(baseIterator_->currentItem());
    }
    
    int currentPosition() const override {
        return baseIterator_->currentPosition();
    }
};

// 分页迭代器:支持分页遍历
template<typename T>
class PagedIterator : public Iterator<T> {
private:
    std::unique_ptr<Iterator<T>> baseIterator_;
    int pageSize_;
    int currentPage_;
    std::vector<T> currentPageItems_;
    int pageIndex_;
    
public:
    PagedIterator(std::unique_ptr<Iterator<T>> baseIterator, int pageSize)
        : baseIterator_(std::move(baseIterator)), pageSize_(pageSize), 
          currentPage_(0), pageIndex_(0) {
        std::cout << "📄 创建分页迭代器,页大小: " << pageSize_ << std::endl;
        loadNextPage();
    }
    
    void first() override {
        baseIterator_->first();
        currentPage_ = 0;
        loadNextPage();
    }
    
    void next() override {
        if (!isDone()) {
            pageIndex_++;
            if (pageIndex_ >= currentPageItems_.size()) {
                loadNextPage();
            }
        }
    }
    
    bool isDone() const override {
        return currentPageItems_.empty();
    }
    
    T currentItem() const override {
        if (isDone()) {
            throw std::out_of_range("迭代器已到达末尾");
        }
        return currentPageItems_[pageIndex_];
    }
    
    int currentPosition() const override {
        return currentPage_ * pageSize_ + pageIndex_;
    }
    
    int getCurrentPage() const {
        return currentPage_;
    }
    
    int getPageCount() const {
        // 简化实现,实际需要知道总元素数
        return -1;
    }
    
private:
    void loadNextPage() {
        currentPageItems_.clear();
        pageIndex_ = 0;
        
        int count = 0;
        while (!baseIterator_->isDone() && count < pageSize_) {
            currentPageItems_.push_back(baseIterator_->currentItem());
            baseIterator_->next();
            count++;
        }
        
        if (!currentPageItems_.empty()) {
            currentPage_++;
            std::cout << "   📖 加载第 " << currentPage_ << " 页,包含 " 
                      << currentPageItems_.size() << " 个元素" << std::endl;
        }
    }
};

// 复合迭代器:合并多个迭代器
template<typename T>
class CompositeIterator : public Iterator<T> {
private:
    std::vector<std::unique_ptr<Iterator<T>>> iterators_;
    size_t currentIteratorIndex_;
    
public:
    CompositeIterator() : currentIteratorIndex_(0) {
        std::cout << "🧩 创建复合迭代器" << std::endl;
    }
    
    void addIterator(std::unique_ptr<Iterator<T>> iterator) {
        iterators_.push_back(std::move(iterator));
    }
    
    void first() override {
        currentIteratorIndex_ = 0;
        for (auto& iterator : iterators_) {
            iterator->first();
        }
    }
    
    void next() override {
        if (isDone()) return;
        
        if (!iterators_[currentIteratorIndex_]->isDone()) {
            iterators_[currentIteratorIndex_]->next();
        }
        
        // 如果当前迭代器结束,移动到下一个
        while (currentIteratorIndex_ < iterators_.size() && 
               iterators_[currentIteratorIndex_]->isDone()) {
            currentIteratorIndex_++;
        }
    }
    
    bool isDone() const override {
        return currentIteratorIndex_ >= iterators_.size();
    }
    
    T currentItem() const override {
        if (isDone()) {
            throw std::out_of_range("迭代器已到达末尾");
        }
        return iterators_[currentIteratorIndex_]->currentItem();
    }
    
    int currentPosition() const override {
        if (isDone()) {
            return -1;
        }
        
        int position = 0;
        for (size_t i = 0; i < currentIteratorIndex_; i++) {
            // 计算前面迭代器的总元素数(简化实现)
            position += 100; // 假设每个迭代器有100个元素
        }
        
        return position + iterators_[currentIteratorIndex_]->currentPosition();
    }
    
    size_t getCurrentSourceIndex() const {
        return currentIteratorIndex_;
    }
};

多媒体数据模型

cpp 复制代码
// 多媒体文件类
class MediaFile {
private:
    std::string filename_;
    std::string type_; // "audio", "video", "image"
    int size_; // KB
    int duration_; // seconds
    int rating_; // 1-5
    
public:
    MediaFile(const std::string& filename, const std::string& type, 
              int size = 0, int duration = 0, int rating = 3)
        : filename_(filename), type_(type), size_(size), 
          duration_(duration), rating_(rating) {}
    
    std::string getFilename() const { return filename_; }
    std::string getType() const { return type_; }
    int getSize() const { return size_; }
    int getDuration() const { return duration_; }
    int getRating() const { return rating_; }
    
    void setRating(int rating) {
        rating_ = std::max(1, std::min(5, rating));
    }
    
    std::string toString() const {
        std::stringstream ss;
        ss << filename_ << " [" << type_ << ", " << size_ << "KB, " 
           << duration_ << "s, 评分:" << rating_ << "/5]";
        return ss.str();
    }
    
    // 用于集合比较
    bool operator<(const MediaFile& other) const {
        return filename_ < other.filename_;
    }
    
    bool operator==(const MediaFile& other) const {
        return filename_ == other.filename_;
    }
};

// 多媒体库类
class MediaLibrary {
private:
    ArrayCollection<MediaFile> audioFiles_;
    ArrayCollection<MediaFile> videoFiles_;
    ArrayCollection<MediaFile> imageFiles_;
    SetCollection<MediaFile> favoriteFiles_;
    
public:
    MediaLibrary() 
        : audioFiles_("音频文件"), videoFiles_("视频文件"), 
          imageFiles_("图片文件"), favoriteFiles_("收藏文件") {
        std::cout << "🏛️  创建多媒体库" << std::endl;
        initializeSampleData();
    }
    
    void initializeSampleData() {
        // 添加示例数据
        audioFiles_.add(MediaFile("song1.mp3", "audio", 5120, 180, 4));
        audioFiles_.add(MediaFile("song2.mp3", "audio", 6144, 210, 5));
        audioFiles_.add(MediaFile("podcast1.mp3", "audio", 10240, 3600, 3));
        
        videoFiles_.add(MediaFile("movie1.mp4", "video", 1048576, 7200, 5));
        videoFiles_.add(MediaFile("clip1.mp4", "video", 51200, 180, 4));
        videoFiles_.add(MediaFile("documentary1.mp4", "video", 2097152, 5400, 4));
        
        imageFiles_.add(MediaFile("photo1.jpg", "image", 2048, 0, 3));
        imageFiles_.add(MediaFile("photo2.jpg", "image", 3072, 0, 5));
        imageFiles_.add(MediaFile("screenshot1.png", "image", 1024, 0, 2));
        
        // 添加一些收藏
        favoriteFiles_.add(MediaFile("song2.mp3", "audio", 6144, 210, 5));
        favoriteFiles_.add(MediaFile("movie1.mp4", "video", 1048576, 7200, 5));
        favoriteFiles_.add(MediaFile("photo2.jpg", "image", 3072, 0, 5));
        
        std::cout << "✅ 多媒体库初始化完成" << std::endl;
    }
    
    // 获取各种迭代器
    std::unique_ptr<Iterator<MediaFile>> getAllFilesIterator() {
        auto composite = std::make_unique<CompositeIterator<MediaFile>>();
        composite->addIterator(audioFiles_.createIterator());
        composite->addIterator(videoFiles_.createIterator());
        composite->addIterator(imageFiles_.createIterator());
        return composite;
    }
    
    std::unique_ptr<Iterator<MediaFile>> getAudioFilesIterator() {
        return audioFiles_.createIterator();
    }
    
    std::unique_ptr<Iterator<MediaFile>> getVideoFilesIterator() {
        return videoFiles_.createIterator();
    }
    
    std::unique_ptr<Iterator<MediaFile>> getImageFilesIterator() {
        return imageFiles_.createIterator();
    }
    
    std::unique_ptr<Iterator<MediaFile>> getFavoriteFilesIterator() {
        return favoriteFiles_.createIterator();
    }
    
    std::unique_ptr<Iterator<MediaFile>> getHighRatedFilesIterator(int minRating = 4) {
        auto allFiles = getAllFilesIterator();
        return std::make_unique<FilterIterator<MediaFile>>(
            std::move(allFiles),
            [minRating](const MediaFile& file) {
                return file.getRating() >= minRating;
            }
        );
    }
    
    std::unique_ptr<Iterator<MediaFile>> getLargeFilesIterator(int minSizeKB = 10240) {
        auto allFiles = getAllFilesIterator();
        return std::make_unique<FilterIterator<MediaFile>>(
            std::move(allFiles),
            [minSizeKB](const MediaFile& file) {
                return file.getSize() >= minSizeKB;
            }
        );
    }
    
    std::unique_ptr<Iterator<std::string>> getFilenamesIterator() {
        auto allFiles = getAllFilesIterator();
        return std::make_unique<TransformIterator<MediaFile, std::string>>(
            std::move(allFiles),
            [](const MediaFile& file) {
                return file.getFilename();
            }
        );
    }
    
    std::unique_ptr<Iterator<MediaFile>> getPagedIterator(int pageSize = 2) {
        auto allFiles = getAllFilesIterator();
        return std::make_unique<PagedIterator<MediaFile>>(
            std::move(allFiles), pageSize
        );
    }
    
    // 统计信息
    void showLibraryStats() {
        std::cout << "\n📊 多媒体库统计信息:" << std::endl;
        std::cout << "   音频文件: " << audioFiles_.size() << " 个" << std::endl;
        std::cout << "   视频文件: " << videoFiles_.size() << " 个" << std::endl;
        std::cout << "   图片文件: " << imageFiles_.size() << " 个" << std::endl;
        std::cout << "   收藏文件: " << favoriteFiles_.size() << " 个" << std::endl;
        
        int totalSize = 0;
        auto iterator = getAllFilesIterator();
        iterator->traverse([&totalSize](const MediaFile& file) {
            totalSize += file.getSize();
        });
        
        std::cout << "   总大小: " << (totalSize / 1024.0) << " MB" << std::endl;
    }
    
    // 添加新文件
    void addMediaFile(const MediaFile& file) {
        if (file.getType() == "audio") {
            audioFiles_.add(file);
        } else if (file.getType() == "video") {
            videoFiles_.add(file);
        } else if (file.getType() == "image") {
            imageFiles_.add(file);
        }
        std::cout << "➕ 添加文件: " << file.getFilename() << std::endl;
    }
    
    // 添加到收藏
    void addToFavorites(const MediaFile& file) {
        favoriteFiles_.add(file);
        std::cout << "⭐ 添加到收藏: " << file.getFilename() << std::endl;
    }
};

完整测试代码

cpp 复制代码
// 测试迭代器模式
void testIteratorPattern() {
    std::cout << "=== 迭代器模式测试开始 ===" << std::endl;
    
    // 创建数组集合并测试
    std::cout << "\n--- 数组集合测试 ---" << std::endl;
    ArrayCollection<int> numbers("数字集合");
    for (int i = 1; i <= 5; i++) {
        numbers.add(i * 10);
    }
    
    auto iterator = numbers.createIterator();
    std::cout << "正向遍历:" << std::endl;
    iterator->traverse([](const int& num) {
        std::cout << "   " << num << std::endl;
    });
    
    auto reverseIterator = numbers.createReverseIterator();
    std::cout << "反向遍历:" << std::endl;
    reverseIterator->traverse([](const int& num) {
        std::cout << "   " << num << std::endl;
    });
    
    // 创建链表集合并测试
    std::cout << "\n--- 链表集合测试 ---" << std::endl;
    LinkedListCollection<std::string> names("名字集合");
    names.add("张三");
    names.add("李四");
    names.add("王五");
    names.addFront("赵六"); // 添加到前面
    
    auto nameIterator = names.createIterator();
    std::cout << "名字遍历:" << std::endl;
    nameIterator->traverse([](const std::string& name) {
        std::cout << "   " << name << std::endl;
    });
    
    // 创建集合并测试
    std::cout << "\n--- 集合测试 ---" << std::endl;
    SetCollection<int> uniqueNumbers("唯一数字集合");
    uniqueNumbers.add(10);
    uniqueNumbers.add(20);
    uniqueNumbers.add(10); // 重复,不会被添加
    uniqueNumbers.add(30);
    
    auto setIterator = uniqueNumbers.createIterator();
    std::cout << "唯一数字遍历:" << std::endl;
    setIterator->traverse([](const int& num) {
        std::cout << "   " << num << std::endl;
    });
    
    std::cout << "\n=== 基础迭代器模式测试结束 ===" << std::endl;
}

// 测试高级迭代器
void testAdvancedIterators() {
    std::cout << "\n=== 高级迭代器测试开始 ===" << std::endl;
    
    // 创建测试数据
    ArrayCollection<int> numbers("测试数字");
    for (int i = 1; i <= 10; i++) {
        numbers.add(i);
    }
    
    // 测试过滤迭代器
    std::cout << "\n--- 过滤迭代器测试 ---" << std::endl;
    auto baseIterator = numbers.createIterator();
    auto evenIterator = std::make_unique<FilterIterator<int>>(
        std::move(baseIterator),
        [](const int& num) { return num % 2 == 0; }
    );
    
    std::cout << "偶数数字:" << std::endl;
    evenIterator->traverse([](const int& num) {
        std::cout << "   " << num << std::endl;
    });
    
    // 测试转换迭代器
    std::cout << "\n--- 转换迭代器测试 ---" << std::endl;
    baseIterator = numbers.createIterator();
    auto squaredIterator = std::make_unique<TransformIterator<int, int>>(
        std::move(baseIterator),
        [](const int& num) { return num * num; }
    );
    
    std::cout << "数字平方:" << std::endl;
    squaredIterator->traverse([](const int& num) {
        std::cout << "   " << num << std::endl;
    });
    
    // 测试分页迭代器
    std::cout << "\n--- 分页迭代器测试 ---" << std::endl;
    baseIterator = numbers.createIterator();
    auto pagedIterator = std::make_unique<PagedIterator<int>>(
        std::move(baseIterator), 3
    );
    
    std::cout << "分页遍历:" << std::endl;
    pagedIterator->traverse([](const int& num) {
        std::cout << "   " << num << " (第" 
                  << dynamic_cast<PagedIterator<int>&>(*pagedIterator).getCurrentPage() 
                  << "页)" << std::endl;
    });
    
    // 测试复合迭代器
    std::cout << "\n--- 复合迭代器测试 ---" << std::endl;
    ArrayCollection<int> collection1("集合1");
    ArrayCollection<int> collection2("集合2");
    
    collection1.add(100);
    collection1.add(200);
    collection2.add(300);
    collection2.add(400);
    
    auto compositeIterator = std::make_unique<CompositeIterator<int>>();
    compositeIterator->addIterator(collection1.createIterator());
    compositeIterator->addIterator(collection2.createIterator());
    
    std::cout << "复合遍历:" << std::endl;
    compositeIterator->traverse([](const int& num) {
        std::cout << "   " << num << std::endl;
    });
    
    std::cout << "\n=== 高级迭代器测试结束 ===" << std::endl;
}

// 测试多媒体库
void testMediaLibrary() {
    std::cout << "\n=== 多媒体库测试开始 ===" << std::endl;
    
    MediaLibrary library;
    
    // 显示库统计
    library.showLibraryStats();
    
    // 测试各种迭代器
    std::cout << "\n--- 所有文件遍历 ---" << std::endl;
    auto allIterator = library.getAllFilesIterator();
    allIterator->traverse([](const MediaFile& file) {
        std::cout << "   " << file.toString() << std::endl;
    });
    
    std::cout << "\n--- 高评分文件遍历 (评分>=4) ---" << std::endl;
    auto highRatedIterator = library.getHighRatedFilesIterator(4);
    highRatedIterator->traverse([](const MediaFile& file) {
        std::cout << "   " << file.toString() << std::endl;
    });
    
    std::cout << "\n--- 大文件遍历 (>=10MB) ---" << std::endl;
    auto largeFilesIterator = library.getLargeFilesIterator(10240);
    largeFilesIterator->traverse([](const MediaFile& file) {
        std::cout << "   " << file.toString() << std::endl;
    });
    
    std::cout << "\n--- 仅文件名遍历 ---" << std::endl;
    auto filenamesIterator = library.getFilenamesIterator();
    filenamesIterator->traverse([](const std::string& filename) {
        std::cout << "   " << filename << std::endl;
    });
    
    std::cout << "\n--- 分页遍历 (每页2个) ---" << std::endl;
    auto pagedIterator = library.getPagedIterator(2);
    pagedIterator->traverse([](const MediaFile& file) {
        std::cout << "   " << file.toString() << std::endl;
    });
    
    std::cout << "\n=== 多媒体库测试结束 ===" << std::endl;
}

// 实战应用:智能媒体播放器
class SmartMediaPlayer {
private:
    MediaLibrary library_;
    std::vector<MediaFile> playHistory_;
    std::vector<MediaFile> playQueue_;
    
public:
    SmartMediaPlayer() {
        std::cout << "🎵 创建智能媒体播放器" << std::endl;
    }
    
    void playAll() {
        std::cout << "\n🎶 播放所有媒体文件..." << std::endl;
        auto iterator = library_.getAllFilesIterator();
        
        iterator->traverse([this](const MediaFile& file) {
            playFile(file);
        });
        
        std::cout << "✅ 所有文件播放完成" << std::endl;
    }
    
    void playHighRated(int minRating = 4) {
        std::cout << "\n⭐ 播放高评分文件 (评分>=" << minRating << ")..." << std::endl;
        auto iterator = library_.getHighRatedFilesIterator(minRating);
        
        iterator->traverse([this](const MediaFile& file) {
            playFile(file);
        });
    }
    
    void playByType(const std::string& type) {
        std::cout << "\n🎯 播放类型: " << type << "..." << std::endl;
        
        std::unique_ptr<Iterator<MediaFile>> iterator;
        if (type == "audio") {
            iterator = library_.getAudioFilesIterator();
        } else if (type == "video") {
            iterator = library_.getVideoFilesIterator();
        } else if (type == "image") {
            iterator = library_.getImageFilesIterator();
        } else {
            std::cout << "❌ 未知媒体类型: " << type << std::endl;
            return;
        }
        
        iterator->traverse([this](const MediaFile& file) {
            playFile(file);
        });
    }
    
    void playFavorites() {
        std::cout << "\n❤️  播放收藏文件..." << std::endl;
        auto iterator = library_.getFavoriteFilesIterator();
        
        iterator->traverse([this](const MediaFile& file) {
            playFile(file);
        });
    }
    
    void createPlaylist(const std::string& name, std::function<bool(const MediaFile&)> criteria) {
        std::cout << "\n📝 创建播放列表: " << name << "..." << std::endl;
        auto allFiles = library_.getAllFilesIterator();
        auto playlistIterator = std::make_unique<FilterIterator<MediaFile>>(
            std::move(allFiles), criteria
        );
        
        int count = 0;
        playlistIterator->traverse([this, &count](const MediaFile& file) {
            playQueue_.push_back(file);
            count++;
        });
        
        std::cout << "✅ 播放列表 '" << name << "' 创建完成,包含 " << count << " 个文件" << std::endl;
    }
    
    void playQueue() {
        std::cout << "\n▶️  播放队列中的文件..." << std::endl;
        for (const auto& file : playQueue_) {
            playFile(file);
        }
        playQueue_.clear();
    }
    
    void showPlayHistory() {
        std::cout << "\n📜 播放历史 (" << playHistory_.size() << " 个文件):" << std::endl;
        for (const auto& file : playHistory_) {
            std::cout << "   " << file.toString() << std::endl;
        }
    }
    
    void runDemo() {
        std::cout << "\n🎮 运行智能媒体播放器演示..." << std::endl;
        std::cout << "==========================" << std::endl;
        
        // 显示库信息
        library_.showLibraryStats();
        
        // 播放各种内容
        playByType("audio");
        playHighRated(5);
        
        // 创建自定义播放列表
        createPlaylist("大型视频文件", [](const MediaFile& file) {
            return file.getType() == "video" && file.getSize() > 500000;
        });
        
        playQueue();
        
        // 显示播放历史
        showPlayHistory();
    }
    
private:
    void playFile(const MediaFile& file) {
        std::cout << "   ▶️  播放: " << file.getFilename() << std::endl;
        
        // 模拟播放过程
        if (file.getType() == "audio" || file.getType() == "video") {
            std::cout << "      ⏱️  时长: " << file.getDuration() << "秒" << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        } else {
            std::cout << "      🖼️  显示图片" << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(50));
        }
        
        // 记录播放历史
        playHistory_.push_back(file);
    }
};

// 高级应用:迭代器工具类
class IteratorUtils {
public:
    // 统计元素数量
    template<typename T>
    static int count(std::unique_ptr<Iterator<T>> iterator) {
        int count = 0;
        iterator->traverse([&count](const T&) { count++; });
        return count;
    }
    
    // 查找元素
    template<typename T>
    static std::optional<T> find(std::unique_ptr<Iterator<T>> iterator, 
                                std::function<bool(const T&)> predicate) {
        for (iterator->first(); !iterator->isDone(); iterator->next()) {
            if (predicate(iterator->currentItem())) {
                return iterator->currentItem();
            }
        }
        return std::nullopt;
    }
    
    // 转换为向量
    template<typename T>
    static std::vector<T> toVector(std::unique_ptr<Iterator<T>> iterator) {
        std::vector<T> result;
        iterator->traverse([&result](const T& item) {
            result.push_back(item);
        });
        return result;
    }
    
    // 应用函数到每个元素
    template<typename T>
    static void forEach(std::unique_ptr<Iterator<T>> iterator, 
                       std::function<void(const T&)> action) {
        iterator->traverse(action);
    }
    
    // 检查所有元素是否满足条件
    template<typename T>
    static bool allMatch(std::unique_ptr<Iterator<T>> iterator, 
                        std::function<bool(const T&)> predicate) {
        for (iterator->first(); !iterator->isDone(); iterator->next()) {
            if (!predicate(iterator->currentItem())) {
                return false;
            }
        }
        return true;
    }
    
    // 检查是否有元素满足条件
    template<typename T>
    static bool anyMatch(std::unique_ptr<Iterator<T>> iterator, 
                        std::function<bool(const T&)> predicate) {
        for (iterator->first(); !iterator->isDone(); iterator->next()) {
            if (predicate(iterator->currentItem())) {
                return true;
            }
        }
        return false;
    }
};

int main() {
    std::cout << "🌈 设计模式武林大会 - 迭代器模式演示 🌈" << std::endl;
    std::cout << "=====================================" << std::endl;
    
    // 测试基础迭代器模式
    testIteratorPattern();
    
    // 测试高级迭代器
    testAdvancedIterators();
    
    // 测试多媒体库
    testMediaLibrary();
    
    // 运行智能媒体播放器演示
    std::cout << "\n=== 智能媒体播放器演示 ===" << std::endl;
    SmartMediaPlayer player;
    player.runDemo();
    
    // 测试迭代器工具类
    std::cout << "\n=== 迭代器工具类测试 ===" << std::endl;
    ArrayCollection<int> testCollection("测试工具类");
    for (int i = 1; i <= 5; i++) {
        testCollection.add(i);
    }
    
    auto testIterator = testCollection.createIterator();
    std::cout << "元素数量: " << IteratorUtils::count<int>(std::move(testIterator)) << std::endl;
    
    testIterator = testCollection.createIterator();
    auto found = IteratorUtils::find<int>(std::move(testIterator), 
        [](int num) { return num > 3; });
    if (found) {
        std::cout << "找到元素: " << found.value() << std::endl;
    }
    
    std::cout << "\n🎉 迭代器模式演示全部完成!" << std::endl;
    
    return 0;
}

迭代器模式的武学心得

适用场景

  • 统一遍历接口:当需要为不同的聚合结构提供统一的遍历方式时
  • 隐藏内部结构:当不希望暴露聚合对象的内部表示时
  • 支持多种遍历:当需要支持多种遍历方式(正序、逆序、过滤等)时
  • 简化客户端代码:当希望简化客户端的遍历代码时

优点

  • 简化聚合接口:聚合对象不需要包含遍历代码
  • 支持多种遍历:可以轻松实现不同的遍历算法
  • 封装性良好:将遍历逻辑封装在迭代器中,不暴露聚合内部
  • 开闭原则:可以增加新的迭代器而不修改聚合类
  • 并行遍历:可以同时使用多个迭代器遍历同一聚合

缺点

  • 增加系统复杂度:每个聚合都需要对应的迭代器类
  • 可能降低性能:迭代器调用可能比直接访问稍慢
  • 修改聚合困难:如果在遍历过程中修改聚合,迭代器可能失效

武林高手的点评

Composite 赞叹道:"Iterator 兄的遍历统一确实精妙!能够如此优雅地处理各种数据结构的遍历,这在需要操作复杂集合的系统中确实无人能及。"

Visitor 也点头称赞:"Iterator 兄专注于元素的遍历访问,而我更关注对元素的操作。我们都涉及集合元素的处理,但关注点不同。"

Iterator 谦虚回应:"诸位过奖了。每个模式都有其适用场景。在需要统一遍历集合元素时,我的迭代器模式确实能发挥重要作用。但在需要对元素执行特定操作时,Visitor 兄的方法更加合适。"

下章预告

在Iterator展示完他那精妙的迭代艺术后,Chain of Responsibility 几位高手手挽手,连成一条长链走来。

"Iterator 兄的遍历统一确实精妙,但在请求处理和职责传递方面,需要更加灵活的链式处理方式。" Chain of Responsibility 为首者说道,"下一章,我们将展示如何通过责任链模式将请求的发送者与接收者解耦,让多个对象都有机会处理请求!"

架构老人满意地点头:"善!请求的链式处理确实是构建灵活系统的关键。下一章,就请 Chain of Responsibility 展示他的责任链艺术!"


欲知 Chain of Responsibility 如何通过责任链模式实现请求的灵活处理,且听下回分解!

相关推荐
青草地溪水旁5 天前
设计模式(C++)详解——迭代器模式(3)
c++·设计模式·迭代器模式
charlie1145141915 天前
精读C++20设计模式——行为型设计模式:迭代器模式
c++·学习·设计模式·迭代器模式·c++20
大飞pkz6 天前
【设计模式】迭代器模式
开发语言·设计模式·c#·迭代器模式
青草地溪水旁8 天前
设计模式(C++)详解——迭代器模式(4)
c++·设计模式·迭代器模式
青草地溪水旁9 天前
设计模式(C++)详解——中介者模式(1)
c++·设计模式·迭代器模式
青草地溪水旁11 天前
设计模式(C++)详解——迭代器模式(1)
c++·设计模式·迭代器模式
青草地溪水旁11 天前
设计模式(C++)详解——迭代器模式(2)
java·c++·设计模式·迭代器模式
new_daimond13 天前
设计模式-迭代器模式详解
设计模式·迭代器模式
ALex_zry1 个月前
Go语言中的迭代器模式与安全访问实践
安全·golang·迭代器模式