命令模式 Spring框架JdbcTemplate

2021-09-27 02:27:37 字數 2595 閱讀 6034

概述

最近回顧了一下設計模式。想到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 之間的...