Iterator pattern
2022. 2. 28. 15:57ㆍSoftware Architecture/Software design
- 목차
반응형
Iterator pattern
어떤 Item이 있고 item들을 담고 있는 menu가 있다고 가정해보겠습니다.
menu 내 item들을 모두 순회하고자 한다면, 다음과 같이 구현되어야 합니다.
class Menu {
public:
uint32 getCost();
};
class ItelianMenu : public Menu {
...
uint32 getCost() {
return m_cost;
}
...
};
auto menu = std::make_shared<std::vector>(std::shared_ptr<Menu>);
menu.push_back(std::make_shared<ItelianMenu>());
menu.push_back(std::make_shared<KoreanMenu>());
...
for (auto i = 0; i < menu.size(); ++i) {
auto cost = menu[i].getCost();
...
}
size를 check하고 첨자연산을 해야 하며, std::vector의 사용 방법을 정확히 알아야 순회하면서 값을 사용할 수가 있습니다.
iterator pattern은 이런 구현 specific한 부분을 사용자가 알지 못하게 하고 추상화된 일관된 interface를 통해 client가 요소들을 반복하면서 access 할 수 있는 방법을 제공하는 pattern 입니다.
template <class Item>
class Iterator {
public:
virtual bool hasNext() = 0;
virtual void first() = 0;
virtual void next() = 0;
virtual bool isDone() = 0;
virtual Item getItem() const = 0;
protected:
Iterator();
};
template <class Item>
class ListIterator : public Iterator {
public:
ListIterator(const List<Item>* alist) :
m_list(alist) {
m_pos = 0;
}
virtual void next() {
m_pos += 1;
}
virtual void first() {
m_pos = 0;
}
virtual isDone() {
return m_pos >= m_list->Count();
}
virtual Item getItem() {
if (isDone()) {
throw IteratorOutOfBounds;
}
return m_list->Get(m_pos);
}
private:
const List<Item>* m_list;
uint64 m_pos;
};
List<Menu>* menus;
// menus..... adding... items....
ListIterator<Menu *> iter(menus);
for (iter.first(); !iter.isDone(); iter.next()) {
iter.getItem()->Print();
}
이제 일관된 사용 방법을 제공하는 interator를 사용해서 원소를 순회하면 됩니다.
반응형
'Software Architecture > Software design' 카테고리의 다른 글
Memento pattern (0) | 2022.02.28 |
---|---|
Mediator pattern (0) | 2022.02.28 |
Interpret pattern (0) | 2022.02.28 |
Flyweight pattern (0) | 2022.02.28 |
Factory method (0) | 2022.02.28 |