迭代器模式:提供一种方法可以顺序访问一个聚合对象中各个元素,而又不需要暴露给该对象的内部表示。
场景:
1.一个聚合对象,如数组、list,应该提供一种方法来让别人可以访问他的元素,而又不需要暴露他的内部结构;
2.支持对聚合对象的多种遍历;
3.为遍历不同的聚合对象结构提供一个统一的接口。
迭代器模式主要实现了存储对象和读取遍历对象的分离。
#include <stdio.h>
#include <string>
#include <vector>
struct Book {
std::string bookName;
int price;
};
class ItemIterator {
public:
virtual Book* first() = 0;
virtual Book* next() = 0;
virtual Book* end() = 0;
virtual int hasSize() = 0;
};
class Library;
class BookIterator :public ItemIterator {
public:
BookIterator(Book* books) {
_books = books;
}
virtual Book* first() override {
return _books;
}
virtual Book* next() override {
if(_pos >= 5) {
return nullptr;
}
return _books + (_pos++);
}
virtual Book* end() override {
return _books + 4;
}
virtual int hasSize() {
return 5;
}
private:
Book* _books;
int _pos = 0;
};
class Library {
public:
virtual ItemIterator* createIterator() = 0;
};
class MyLibrary:public Library {
public:
ItemIterator* createIterator()override {
return new BookIterator(_books);
}
void addBook(std::string bookName,int price) {
Book* oneBook = new Book;
oneBook->bookName = bookName;
oneBook->price = price;
_books[_pos] = *oneBook;
_pos++;
}
private:
Book _books[5];
int _pos = 0;
};
int main() {
MyLibrary* lib = new MyLibrary;
lib->addBook("语文", 50);
lib->addBook("数学", 55);
lib->addBook("英语", 40);
lib->addBook("政治", 56);
lib->addBook("历史", 60);
ItemIterator* it = lib->createIterator();
for(int i = 0; i < it->hasSize();i++) {
Book *aBook = it->next();
printf("%s : %d\n", aBook->bookName.c_str(), aBook->price);
}
return 0;
}
运行结果: