概述
最近回顧了一下設計模式。想到spring框架中,使用設計模式挺多的。於是搜尋了一下spring中有沒有使用命令模式?
參照:命令模式**,然後對spring中的jdbctemplate類進行了原始碼閱讀,現在就命令模式,對jdbctemplate中的部分**做一下解讀。
命令模式簡介
在軟體設計中,我們經常需要向某些物件傳送請求,但是並不知道請求的接收者是誰,也不知道被請求的操作是哪個,
我們只需在程式執行時指定具體的請求接收者即可,此時,可以使用命令模式來進行設計,
使得請求傳送者與請求接收者消除彼此之間的耦合,讓物件之間的呼叫關係更加靈活。
舉個例子吧,將軍發布命令,士兵去執行。其中有幾個角色:將軍(命令發布者)、士兵(命令的具體執行者)、命令(連線將軍和士兵)。
invoker是呼叫者(將軍),receiver是被呼叫者(士兵),mycommand是命令,實現了command介面,持有接收物件
jdbctemplate部分**解析
此類在工作中經常被使用。其中的query方法,進行了大量的過載。
我們拿其中的乙個過載方法來說:
@override
}
這個方法呼叫了:
@override
public t query(final string sql, final resultsetextractorrse) throws dataacces***ception
class querystatementcallback implements statementcallback, sqlprovider
return rse.extractdata(rstouse);
}finally
}@override
public string getsql()
}return execute(new querystatementcallback());
}
其中,我們發現有乙個匿名內部類:** querystatementcallback,它實現了 statementcallback介面。
statementcallback介面中有唯一的doinstatement**方法:
t doinstatement(statement stmt) throws sqlexception, dataacces***ception;
我們再接著往下看,
public t query(final string sql, final resultsetextractorrse) throws dataacces***ception
最後,呼叫了execute(new querystatementcallback())方法,並且把匿名內部類querystatementcallback的例項物件當做引數傳遞了過去。
@override
public t execute(statementcallbackaction) throws dataacces***ception
stmt = contouse.createstatement();
statement stmttouse = stmt;
if (this.nativejdbcextractor != null)
t result = action.doinstatement(stmttouse);
handlewarnings(stmt);
return result;
}catch (sqlexception ex)
finally
}
我們著重看一下這一行**:
t result = action.doinstatement(stmttouse);
其中action引數是** statementcallback**型別。
命令模式角色對應解析
在這個query查詢中,我們可以把 ** statementcallback介面看做命令介面。
匿名內部類 querystatementcallback是該命令介面的乙個具體實現命令。
在 querystatementcallback中,對 doinstatement介面進行了重寫,具體實現了命令的執行。(相當於執行命令的士兵,這裡沒有用具體的類去單獨寫)
而命令呼叫者(將軍),是 t execute(statementcallback action)方法。根據傳遞的具體命令不同,最後action.doinstatement(stmttouse)執行的具體命令也就不同。
其中, querystatementcallback的具體實現類還有以下幾個:
同時,我們可以看到命令呼叫者: t execute(statementcallback action)**方法呼叫時,也對應傳遞了相應的具體命令。
備註spring版本:4.3
Spring框架中的設計模式(三)
這篇文章的第乙個設計模式是原型。可以通過官方文件查詢有關spring作用域中的bean作用域的文章中介紹了類似的概念 prototype 原型設計模式與有用相同名稱的 prototype 作用域有點相似。此設計模式允許通過複製已存在的物件來建立乙個物件的例項。副本應該是真正的副本。這意味著新物件的所...
Spring框架中用到了哪些設計模式
設計模式 spring aop功能的實現。單例設計模式 spring中的bean預設都是單例的。模板方法模式 spring 中 jdbctemplate hibernatetemplate 等以 template結尾的對資料庫操作的類,它們就使用到了模板模式。包裝器設計模式 我們的專案需要連線多個資...
Spring 框架中使用了哪些涉及模式
1 簡單工廠模式 非 23 種設計模式中的一種 使用方式 beanfactory 介面,根據傳入的唯一標誌 名稱 來獲取 bean 物件。實現原理 通過乙個工廠類根據傳入的引數,動態建立對應的產品類物件。優點耦合性低,通過工廠類動態建立 bean 物件,解決了以前硬編碼的耦合性問題,bean 之間的...