命令模式 ( command pattern) : 在軟體設計中,我們經常需要向某些物件傳送請求,但是並布置的請求的接收者是誰,也不知道被請求的操作是哪個,我們只需要程式執行時指定具體的請求接受者即可,此時,可以使用命令模式來進行設計
命令模式使得請求傳送者與請求接收者消標題
除彼此間的耦合,讓物件之間呼叫關係更加靈活,實現解耦
在命令模式中,會將乙個請求封裝為乙個物件,以便使用不同的引數來表示不同的請求(即命名),同時命令模式頁支援可撤銷的操作
理解:將軍發布命令、士兵去執行、其中 將軍(命令發布者) 、士兵(命令具體執行者)、命令(連線將軍和士兵)
命令模式可以將 「動作的請求」 者 從 「動作的執行者」 物件解析出來
實現:建立 command 介面
public
inte***ce
command
實現 command 介面 lightoffcommand 類
public
class
lightoffcommand
implements
command
@override
public
void
execute()
@override
public
void
undo()
}
實現 command 介面 lightoncommand 類
public
class
lightoncommand
implements
command
@override
public
void
execute()
@override
public
void
undo()
}
接受者 lightreceiver
public
class
lightreceiver
public
void
off(
)}
做乙個空實現,用於初始化
public
class
nocommand
implements
command
@override
public
void
undo()
}
執行者
public
class
remotecontroller
}/**
* 設定成命令
* @param no
* @param oncommand
* @param offcommand
*/public
void
setcommand
(int no,command oncommand,command offcommand)
/** * 按下開機按鈕
* @param no
*/public
void
onbuttonwaspushed
(int no)
/** * 按下關機按鈕
* @param no
*/public
void
offbuttonwaspushed
(int no)
/** * 按下關機按鈕
* @param no
*/public
void
undobuttonwaspushed
(int no)
}
客戶端
命令模式在spring原始碼中使用 query 查詢
@autowired
private jdbctemplate jdbctemplate;
public
voidt1(
)
點進去 會發現原始碼中呼叫
@nullable
public
t query
(final string sql,
final resultsetextractor
rse)
throws dataacces***ception
class
querystatementcallback
implements
statementcallback
, sqlprovider
@nullable
public t doinstatement
(statement stmt)
throws sqlexception
finally
return var3;
}public string getsql()
}return
this
.execute
((statementcallback)
(new
querystatementcallback()
));}
這裡面有個內部類 querystatementcallback 實現了 statementcallback 介面
而這個介面只有乙個方法
@nullable
t doinstatement
(statement stmt)
throws sqlexception, dataacces***ception;
statementcallback 介面的實現
然後我們看看這個類具體實現方法 doinstatement 本質上就是呼叫這個方法的引數的 executequery 方法 執行sql。
最後就是建立了這個內部類的例項傳給 execute方法 ,點進去
@nullable
public
t execute
(statementcallback
action)
throws dataacces***ception
catch
(sqlexception var9)
finally
return var11;
}
1)statementcallback 介面,類似命令介面(command)
2)class querystatementcallback implement statementcallback,sqlprovider,匿名內部類,實現了命令介面,同時也充當命令接收者;
3)命令呼叫者是 jdbctemplate ,其中 execute(statementcallback action) 方法中,呼叫 action.doinstatement() 方法,不同的實現 statementcallback 介面的物件,對應不同的 doinstatement 實現邏輯;
github demo位址 : ~~~傳送門~~~
深入理解23種設計模式 23 責任鏈模式
責任鏈模式 chain of responsibility pattern 為請求者建立乙個接受者物件的鏈,這種模式對請求對傳送者和請求者進行解耦。責任鏈模式通常每個接收者都包含對另乙個接收者都引用,如果乙個物件不能處理該請求,那麼他就會把相同的請求傳給下乙個接收者解耦,以此類推。這種型別的設計模式...
深入理解23種設計模式 9 外觀模式
外觀模式 facade pattern 門面模式,隱藏系統的複雜性,並向客戶端提供了乙個客戶端可以訪問系統的介面,這種型別的設計模式屬於結構型模式,他向現有的系統新增乙個介面,來隱藏系統的複雜性,這種模式涉及到乙個單一的類,該類提供類乙個客戶端請求的簡化方法和對現有系統類方法對委託呼叫 傳送郵件 p...
深入理解23種設計模式 21 狀態模式
狀態模式 state pattern 它主要是用來解決物件在多種狀態之間的轉換,需要對外輸出不同的行為的問題,狀態和行為是一一對應的,狀態之間可以互相轉換。當乙個物件的內在狀態改變時,允許改變其行為,這個物件看起來是改變了其他類。活動 假如每參加一次這個活動要扣除50積分,中獎概率是10 獎品數量固...