반응형
🎈 반복자 패턴 (Iterator Pattern)
• 컬렉션 요소를 순회하는 방법을 추상화하는 디자인 패턴
• 반복자: 컨테이너의 요소를 가리키다가 약속된 방식으로 열거하는 객체
• 디자인 패턴 중 행위 패턴에 해당
[예제 코드]
#include <iostream>
#include <vector>
template <typename T>
class Iterator {
public:
virtual T next() = 0;
virtual bool hasNext() = 0;
};
template <typename T>
class VectorIterator : public Iterator<T> {
public:
VectorIterator(std::vector<T>& data) : data(data), index(0) {}
T next() override {
return data[index++];
}
bool hasNext() override {
return index < data.size();
}
private:
std::vector<T>& data;
size_t index;
};
int main() {
std::vector<int> numbers = { 1, 2, 3, 4, 5 };
VectorIterator<int> it(numbers);
// 순회
while (it.hasNext()) {
int value = it.next();
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
- 벡터를 순회하기 위한 Iterator 정의
- 순회하는 구체적인 Iterator 클래스 정의
🎈 반복자 패턴 장단점
+ 분리된 순회 로직
→ 컬렉션 내부 구조와 순회 로직을 분리시킬 수 있다. (낮은 결합도를 통한 유지보수 확장성 up)
+ 순회 동작 캡슐화
→ 클라이언트 코드가 컬렉션 내부 구조에 직접 접근하지 않도록한다.
+ 다양한 순회 방법
→ 순방향, 역방향, 특정 조건 필터링 등
- 복잡성 증가
- 추가 오버헤드 발생
Q) 반복자 패턴을 적용하지 않는다면 어떻게 될까?
배열/컬렉션 크기, 순회 타입/방법 등
대상에 따른 구현이 그때그때 필요하다.
[예제 코드]
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 벡터 직접 순회
for (size_t i = 0; i < numbers.size(); ++i) {
int value = numbers[i];
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
int 타입에 맞춰서 for문을 구현하였다.
반응형
'까망 동네 > 디자인 패턴' 카테고리의 다른 글
[디자인패턴] 체인 패턴 (Chain of Responsibility, 책임 연쇄) (4) | 2024.07.31 |
---|---|
객체 지향 프로그래밍 5대 원칙 [SOLID] (40) | 2023.11.19 |
[디자인패턴] 방문자 패턴 (Visitor Pattern) (3) | 2023.11.13 |
[디자인 패턴] 경량 패턴 (Flyweight Pattern) (2) | 2023.11.12 |
[디자인 패턴] 프록시 패턴 (Proxy Pattern) (3) | 2023.11.11 |
댓글