您的位置:首页 > 其它

LevelDB 设计模式 Iterator模式

2015-10-09 10:27 381 查看
LevelDB 设计模式 Iterator模式

flyfish 2015-10-9

Iterator模式(迭代器) 对象行为型模式

意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.

适用性

1 访问一个聚合对象的内容而无需暴露它的内部表示.

2 支持对聚合对象的多种遍历

3 为遍历不同的聚合结构提供一个统一的接口(支持多态迭代).

参与者

1 Iterator(迭代器) 迭代器定义访问和遍历元素的接口.

2 ConcreteIterator(具体迭代器) 具体迭代器实现迭代器接口. 对该聚合遍历时跟踪当前位置.

3 Aggregate(聚合) 聚合定义创建相应迭代器对象的接口.

4 ConcreteAggregate(具体聚合) 具体聚合实现创建相应迭代器的接口, 该操作返回ConcreteIterator的一个适当的实例.

引用自《设计模式 可复用面向对象软件的基础》

LevelDB

Iterator(迭代器)

class Iterator {
public:
Iterator();
virtual ~Iterator();
virtual bool Valid() const = 0;
virtual void SeekToFirst() = 0;
virtual void SeekToLast() = 0;
virtual void Seek(const Slice& target) = 0;
virtual void Next() = 0;
virtual void Prev() = 0;
virtual Slice key() const = 0;
virtual Slice value() const = 0;
virtual Status status() const = 0;
typedef void (*CleanupFunction)(void* arg1, void* arg2);
void RegisterCleanup(CleanupFunction function, void* arg1, void* arg2);

private:
struct Cleanup {
CleanupFunction function;
void* arg1;
void* arg2;
Cleanup* next;
};
Cleanup cleanup_;

// No copying allowed
Iterator(const Iterator&);
void operator=(const Iterator&);
};

// Return an empty iterator (yields nothing).
extern Iterator* NewEmptyIterator();

// Return an empty iterator with the specified status.
extern Iterator* NewErrorIterator(const Status& status);


ConcreteIterator(具体迭代器)

class EmptyIterator : public Iterator

class MemTableIterator: public Iterator

class MergingIterator : public Iterator

class TwoLevelIterator: public Iterator

class DBIter: public Iterator

class Block::Iter : public Iterator

class Version::LevelFileNumIterator : public Iterator


ConcreteAggregate(具体聚合)

//Block
class Block
{
public:
Iterator* NewIterator(const Comparator* comparator);
};

Iterator* Block::NewIterator(const Comparator* cmp) {
if (size_ < 2*sizeof(uint32_t)) {
return NewErrorIterator(Status::Corruption("bad block contents"));
}
const uint32_t num_restarts = NumRestarts();
if (num_restarts == 0) {
return NewEmptyIterator();
} else {
return new Iter(cmp, data_, restart_offset_, num_restarts);
}
}

}
//MemTable
class MemTable
{
public:
Iterator* NewIterator();
};
Iterator* MemTable::NewIterator() {
return new MemTableIterator(&table_);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: