您好,登錄后才能下訂單哦!
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負責版本的構建和更新等工作。建造者模式將產品的使用者不必了解產品內部組成細節,也不必參與產品的構建過程;而且將復雜產品的創建過程分解在不同的方法中,使得創建過程更加清晰,也更方便使用程序來控制創建過程。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。