设计模式(十五)-- 迭代器模式
layout: post
title: 设计模式(十五)– 迭代器模式
description: 设计模式(十五)– 迭代器模式
categories:
- 设计模式
tags: - 设计模式
面向对象
迭代器模式
1.概述
提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式
2.结构图
3.角色
- Iterator(抽象迭代器):它定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法,例如:用于获取第一个元素的first()方法,用于访问下一个元素的next()方法,用于判断是否还有下一个元素的hasNext()方法,用于获取当前元素的currentItem()方法等,在具体迭代器中将实现这些方法。
- ConcreteIterator(具体迭代器):它实现了抽象迭代器接口,完成对聚合对象的遍历,同时在具体迭代器中通过游标来记录在聚合对象中所处的当前位置,在具体实现时,游标通常是一个表示位置的非负整数。
- Aggregate(抽象聚合类):它用于存储和管理元素对象,声明一个createIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。
- ConcreteAggregate(具体聚合类):它实现了在抽象聚合类中声明的createIterator()方法,该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator实例。
4.C语言实现
// 定义一个迭代器接口
struct Iterator {
void* (*next)();
int (*hasNext)();
};
// 定义一个聚合类
struct Aggregate {
int* items;
int size;
struct Iterator* iterator;
};
// 定义一个具体迭代器类
struct ConcreteIterator {
struct Aggregate* aggregate;
int current;
};
// 实现迭代器接口的 next 方法
void* next(struct Iterator* iterator) {
struct ConcreteIterator* ci = (struct ConcreteIterator*)iterator;
if (ci->current < ci->aggregate->size) {
return &ci->aggregate->items[ci->current++];
}
return NULL;
}
// 实现迭代器接口的 hasNext 方法
int hasNext(struct Iterator* iterator) {
struct ConcreteIterator* ci = (struct ConcreteIterator*)iterator;
return ci->current < ci->aggregate->size;
}
// 实现聚合类的迭代器方法
struct Iterator* getIterator(struct Aggregate* aggregate) {
struct ConcreteIterator* ci = (struct ConcreteIterator*)malloc(sizeof(struct ConcreteIterator));
ci->aggregate = aggregate;
ci->current = 0;
ci->iterator.next = next;
ci->iterator.hasNext = hasNext;
return (struct Iterator*)ci;
}
int main() {
struct Aggregate aggregate;
aggregate.size = 5;
aggregate.items = (int*)malloc(sizeof(int) * aggregate.size);
aggregate.iterator = getIterator(&aggregate);
while (aggregate.iterator->hasNext(aggregate.iterator)) {
int* item = (int*)aggregate.iterator->next(aggregate.iterator);
printf("%d\n", *item);
}
return 0;
}
这是一个简单的示例,它将聚合类的元素打印到控制台
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 开心大佬
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果