标签:leveldb 设计模式 iterator 代理模式 责任链模式 建造者模式
Iterator模式:
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。leveldb中include/leveldb.h定义了iterator基类,访问某层sst、某个sst内部kv、某个memtable内部kv、整个DB内部kv都需要迭代器,都是通过继承iterator来实现自己的迭代器版本。这样做能将容器中遍历数据的职能和其他职能分离开来,遵守了单一职能原则;增加新的聚合类时,只需继承iterator基类实现新的迭代器版本,遵守了开闭原则。另外,SkipList的迭代器使用内部类实现,提高了封装性,利于获取其外部类的全部访问权限。
责任链模式:
是对象的行为模式。使多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递请求。compaction是leveldb的核心设计、比较复杂的部分。因此比较好的逻辑是将复杂的职能分离开来,交由若干函数依次处理(这里的对象换成了函数,涉及MaybeScheduleCompaction、BackgroundCall、BackgroundCompaction、DoCompactionWork、InstallCompactionResults等等),MaybeScheduleCompaction负责判断是否已经schedule了compaction、DB是否正被删除、是否有错误、是否需要compaction,BackgroundCall负责判断是否后台没有其他线程执行且没有后台错误,BackgroundCompaction负责判断是否为人工合并以及为compaction做准备工作(比如需要compaction的文件),DoCompactionWork则是真正的compaction的工作,InstallCompactionResults负责构造一个新的edit,并调用LogAndApply函数生成新的leveldb版本。
代理模式:
当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问。leveldb中LRUHandle、BlockHandle、EnvWrapper的设计均体现了代理模式。LRUHandle可以理解为LRUCache采用了引用计数的代理类,类似于智能指针,首先减小了LRUCache复制的庞大开销,LRUHandle也方便了对LRUCache的LookUp、Insert、LRU_Append、LRU_Remove等的操作。BlockHandle是Block的代理类,指出了Block的偏移和大小,方便读取Block。关于EnvWrapper,leveldb中的Env主要封装了操作系统的文件接口、后台线程的调度以及锁的实现,Env是抽象基类,PosixEnv继承实现Env,而EnvWrapper即是Env子类PosixEnv的代理类。
建造者模式:
是较为复杂的创建型模式,将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。leveldb中的具体应用有TableBuilder、BlockBuilder、FilterBlockBuilder、VersionSet::Builder等。TableBuilder负责构造Table,而TableBuilder的成员有BlockBuilder、FilterBlockBuilder,前者负责构造index block和data block,后者负责构造meta block。VersionSet::Builder负责版本的构建和更新等工作。建造者模式将产品的使用者不必了解产品内部组成细节,也不必参与产品的构建过程;而且将复杂产品的创建过程分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
本文出自 “李昊华的博客” 博客,请务必保留此出处http://lh2debug.blog.51cto.com/12490788/1890163
标签:leveldb 设计模式 iterator 代理模式 责任链模式 建造者模式
原文地址:http://lh2debug.blog.51cto.com/12490788/1890163