生活場景: 普通使用者電腦開機問題,客戶端發出命令或請求,不關心真正的接收者是誰,也不關心具體如何實現,而且同乙個請求的動作可以有不同的請求內容,當然具體的處理功能也不一樣。
同理: 老闆(boss)給專案經理(leader)下達任務,專案經理會根據實際情況給每個員工派發任務,待員工把任務完成後,再由專案經理向老闆匯報結果。
將乙個請求封裝成乙個物件,從而使你可用不同的請求對客戶進行引數化,對請求排隊或記錄請求日誌,以及支援可撤銷的操作。將」發出請求的物件」和」接收與執行這些請求的物件」分隔開來。
序號參與者說明1
command
宣告執行操作的介面
2concretecommand
將乙個接收者物件繫結於乙個動作, 呼叫接收者相應的操作,以實現execute
3client
建立乙個具體命令物件並設定它的接收者。
4invoker
要求該命令執行這個請求。
5receiver
知道如何實現與執行乙個請求相關的操作。任何類都可能作為乙個接收者。
舉個栗子:
client: 看電視的人
invoker: 遙控器
command: 電訊號
concretecommand: 具體命令,遙控器上的按鍵對應的不同的電訊號
receiver: 電視機
模擬電腦開機的案例
package com.hanker.dao.impl;
//主機板介面--抽象receiver
inte***ce
mainboardapi
//技嘉主機板--具體接收者receiver
class
gigamainboard
implements
mainboardapi
}//微星主機板--具體接收者receiver
class
msimainboard
implements
mainboardapi
}//命令介面
inte***ce
command
//開機命令--具體command
class
opencommand
implements
command
@override
public
void
execute()
}//機箱物件--呼叫者invoker
class
box//提供給客戶使用,接收並響應使用者請求,相當於按鈕被按下觸發的方法
所謂命令模式的引數化配置,指的是:可以用不同的命令物件,去引數化配置客戶的請求。
下面增加乙個命令重啟命令,實現引數化配置。在原來的**上增加方法:
package com.kongfanyu.springcloud.config;
//主機板介面
inte***ce
mainboardapi
//技嘉主機板
class
gigamainboard
implements
mainboardapi
//真正重啟命令的實現
@override
public
void
reset()
}//微星主機板
class
msimainboard
implements
mainboardapi
//真正重啟命令的實現
@override
public
void
reset()
}//命令介面
inte***ce
command
//開機命令
class
opencommand
implements
command
@override
public
void
execute()
}//重啟命令
class
resetcommand
implements
command
@override
public
void
execute()
}//機箱物件
class
box//設定重啟命令物件
public
void
setresetcommand
(command command)
//提供給客戶使用,接收並響應使用者請求,相當於按鈕被按下觸發的方法
public
void
openbuttonpressed()
//提供給使用者使用,接收並響應使用者請求,相當於重啟按鈕被按下觸發的方法
public
void
resetbuttonpressed()
}public
class
commandpatterntest2
}
執行結果:
正確配置下********************===>
>>>按下開機按鈕:>>>
技嘉主機板現在正在開機,請稍候...
接通電源...
裝置檢查...
裝載系統...
機器已經正常開啟,請操作...
>>>按下重啟按鈕:>>>
技嘉主機板現在正在重新啟動機器,請等候..
機器已經正常開啟,請操作
process finished with exit code 0
還有廚師做飯的案例也是命令模式的典型場景。
命令模式的核心思想就是將命令或者請求封裝成物件,分離請求呼叫者和請求最終執行者。
優點:將請求呼叫者和執行者解耦,適用於底層介面封裝,可以通過只增加類就可以實現介面擴充套件,不需要修改原來的**。
缺點:如果存在較多的命令或者請求,需要較多的命令類。
設計模式之命令設計模式
先來看一下命令模式的類圖 乍一看好像類很多,其實我們逐個分析他們。類圖中存在的類可以分為 invoker icommand conceretecommand receiver invoker類 上層直接調取invoker類 icommand 是對命令的抽象 conceretecommand 是命令的...
設計模式之命令模式
command pattern 將請求封裝成物件,這可以讓你使用不同的請求,佇列,或者是日誌請求來引數化其他物件,命令模式也可以支援撤銷操作。命令模式有兩種實現方式 1.在命令管理器中提供設定當前命令接受者的方法,當執行訊息或者是有訊息壓入的時候直接將命令傳送給當前設定的接受者。2.在命令管理器中建...
設計模式之命令模式
當我們有一台多功能的印表機,然後通過電腦直接進行任務,如圖 如果通過這樣的設計直接去呼叫多功能一體機的功能,就會存在此時此刻只能進行乙個任務,不允許有多個客戶端同時操作.那麼現在我們就需要考慮一種新的設計模式,叫做命令設計模式。命令設計模式 將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行...