LevelDB 设计模式 Iterator模式

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_);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西笑生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值