模板模式在原始碼中的體現

2021-10-10 08:19:46 字數 1332 閱讀 8673

先來看jdk 中的abstractlist,來看**:

public abstract class abstractlistextends abstractcollectionimplements list
我們看到get()是乙個抽象方法,那麼它的邏輯就是交給子類來實現,我們大家所熟知的arraylist 就是abstractlist 的子類。同理, 有abstractlist 就有abstractset 和abstractmap,有興趣的小夥伴可以去看看這些的原始碼實現。還有乙個每天都在用的httpservlet,有三個方法service()和doget()、dopost()方法,都是模板方法的抽象實現。

在mybatis 框架也有一些經典的應用,我們來一下baseexecutor 類,它是乙個基礎的sql 執行類,實現了大部分的sql 執行邏輯,然後把幾個方法交給子類定製化完成,原始碼如下:

...

public abstract class baseexecutor implements executor

如doupdate、doflushstatements、doquery、doquerycursor 這幾個方法就是交由子類來實現,那麼baseexecutor 有哪些子類呢?我們來看一下它的類圖:

我們一起來看一下******executor 的doupdate 實現:

statement stmt = null;

int var6;

try finally

return var6;}

再來對比一下batchexecutor 的doupate 實現:

configuration configuration = ms.getconfiguration();

statementhandler handler = configuration.newstatementhandler(this, ms, parameterobject, rowbounds.default, (resulthandler)null, (boundsql)null);

boundsql boundsql = handler.getboundsql();

string sql = boundsql.getsql();

statement stmt;

if (sql.equals(this.currentsql) && ms.equals(this.currentstatement)) else

handler.batch(stmt);

return -2147482646;}

細心的小夥伴一定看出來了差異。當然,我們在這裡就暫時不對mybatis 原始碼進行深入分析。

Android 原始碼的模板方法模式

在物件導向開發過程中,通常會遇到這樣的乙個問題,我們知道乙個演算法所需的關鍵步驟,並確定了這些步驟的執行順序,但是某些步驟的具體實現是未知的,或者說某些步驟的實現是會隨著環境的變化而改變的。例如,執行程式的流程大致如下 檢查 的正確性 鏈結相關的類庫 編譯相關 執行程式 對於不同的程式語言,上述 4...

《Android原始碼設計模式》 模板方法模式

no1 模板方法模式包括 抽象類 其中定義了一系列順序方法 具體實現類a 具體實現類b 如果子類有實現不一樣的細節,重寫父類的某個方法即可 no2 asynctask物件呼叫execute方法後會依次執行onpreexecute doinbackground onpostexecute或onprog...

《STL原始碼剖析》學習 STL體現的思想

stl總是盡量做到節省記憶體且效率最高,在看本書中也越來越有深的體會。這裡蒐集乙個stl中提高效率的方法。1.物件的複製 析構等 如果將乙個區間中的所有的物件析構掉,這是如果範圍很大,每個析構都是無關痛癢的,對效率有很大傷害。負責物件析構的destroy 有兩個版本,第乙個版本直接呼叫物件的析構函式...