command模式也叫命令模式 ,是行為設計模式的一種。command模式通過被稱為command的類封裝了對目標物件的呼叫行為以及呼叫引數。
應用場景
在物件導向的程式設計中,乙個物件呼叫另乙個物件,一般情況下的呼叫過程是:建立目標物件例項;設定呼叫引數;呼叫目標物件的方法。但在有些情況下有必要使用乙個專門的類對這種呼叫過程加以封裝,我們把這種專門的類稱作command類。
命令模式的結構
這裡以乙個家電自動化遙控器api專案的問題為例來實現命令模式的應用。
其實遙控器的需求就是不同的按鈕控制不同的家電,比如有控制燈的,有控制電視的,有控制音箱的。按照物件導向的設計原則,我們就設計家電類和控制類就可以實現了,控制類去控制家電類中不同的具體的命令。但是這種方案的缺陷是什麼呢?就是我們要新增新的家電的時候需要新增新的類並且同時修改控制類,也就是說這個過程中不同的家電執行的命令和家電之間是高耦合的,不利於**的維護和擴充套件。
既然命令是需要改變的變數,我們把命令單獨抽取出來形成介面,然後有具體的類去實現它,這樣的話其實就是把命令和家電之間的關係進行了解耦合。具體的設計方案如下:
看一下**的具體實現:
command介面:
public
inte***ce
command
具體實現command介面的類:
public
class
lightoncommand
implements
command
@override
public
void
execute()
@override
public
void
undo()
}
public
class
lightoffcommand
implements
command
@override
public
void
execute()
@override
public
void
undo()
}
等等。。。其餘的設別的控制命令的實現類同理。
control介面:
public
inte***ce
control
實現類:
public
class
commandmodecontrol
implements
control
}public
void
setcommand
(int slot,command oncommand,command offcommand)
@override
public
void
onbutton
(int slot)
@override
public
void
offbutton
(int slot)
@override
public
void
undobutton()
}
裝置的類就不在贅述了,其實很簡單的
最後是測試這個工程的類
public
class
controltest
; command[
] offcommands=
;
onmarco=
newmarcocommand
(oncommands)
; offmarco=
newmarcocommand
(offcommands);
stereooncommand stereoon =
newstereooncommand
(stereo)
; stereooffcommand stereooff =
newstereooffcommand
(stereo)
; stereoaddvolcommand stereoaddvol =
newstereoaddvolcommand
(stereo)
; stereosubvolcommand stereosubvol =
newstereosubvolcommand
(stereo)
; control.
setcommand(0
, bedroomlighton, bedroomlightoff)
; control.
setcommand(1
, kitchlighton, kitchlightoff)
; control.
setcommand(2
, stereoon, stereooff)
; control.
setcommand(3
, stereoaddvol, stereosubvol)
; control.
setcommand(4
, onmarco, offmarco)
; control.
onbutton(0
);control.
undobutton()
;control.
onbutton(1
);control.
offbutton(1
);control.
onbutton(2
);control.
onbutton(3
);control.
offbutton(3
);control.
undobutton()
; control.
offbutton(2
);control.
undobutton()
; control.
onbutton(4
);control.
offbutton(4
);}}
通過上面的命令模式的例子我們可以看到通過命令模式實現了命令與裝置之間的解耦合,就是使得命令和裝置之間不是那麼強相關的,便不再是具體的裝置中來寫具體的命令,而是專門抽象出乙個介面,然後由具體的命令去具體的實現它。 設計模式之命令設計模式
先來看一下命令模式的類圖 乍一看好像類很多,其實我們逐個分析他們。類圖中存在的類可以分為 invoker icommand conceretecommand receiver invoker類 上層直接調取invoker類 icommand 是對命令的抽象 conceretecommand 是命令的...
設計模式之命令模式
command pattern 將請求封裝成物件,這可以讓你使用不同的請求,佇列,或者是日誌請求來引數化其他物件,命令模式也可以支援撤銷操作。命令模式有兩種實現方式 1.在命令管理器中提供設定當前命令接受者的方法,當執行訊息或者是有訊息壓入的時候直接將命令傳送給當前設定的接受者。2.在命令管理器中建...
設計模式之命令模式
當我們有一台多功能的印表機,然後通過電腦直接進行任務,如圖 如果通過這樣的設計直接去呼叫多功能一體機的功能,就會存在此時此刻只能進行乙個任務,不允許有多個客戶端同時操作.那麼現在我們就需要考慮一種新的設計模式,叫做命令設計模式。命令設計模式 將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行...