Iterator pattern

2022. 2. 28. 15:57Software 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