? 命令模式:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消的操作。
所涉及的角色:
1.客戶(Client)角色:
創建一個具體對象及其確定接收者.
2.命令(Command)角色:聲明了一個給所有具體命令類的抽象接口。
3.具體命令(ConcreteCommand)角色:定義一個接收者與行為之間的弱耦合,實現exceute()方法,負責調用接收者的相應操作
4.請求者(Invoker)角色:
負責調用命令對象執行請求。
5.接收者(Recevice)角色:負責具體實施與執行一個請求。
commmand.bmp
優點:
解耦了發送者和接受者之間聯系。 發送者調用一個操作,接受者接受請求執行相應的動作,因為使用Command模式解耦,發送者無需知道接受者任何接口。
命令模式創建的一般步驟
1.客戶端創建一個ConcreteCommand對象,并指明接收者。
2.請求對象保持ConcreteCommand對象。
3.請求對象通過調用action方法發出請求,若命令是可撤消,則ConcreteCommand保存execute()方法執行前的狀態。
4.ConcreteCommand對象調用接收的方法執行請求。

一個簡單例子:
抽象命令接口:
package?command;
public?interface?Command{
????
//執行方法
?????void?execute();
}
具體命令
package?command;
public?class?ConcreteCommand?implements?Command{
????
//接收者
????private?Receiver?receiver;
????
//構造方法
????public?ConcreteCommand(Receiver?receiver){
????????
this.receiver=receiver;
????}

????
//執行方法
????public?void?execute(){
????????receiver.action();
????}

}
接收者:
package?command;
public??class?Receiver?{
????
//構造方法
????public?Receiver(){};
????
//行為方法
????public?void?action(){
????????System.out.println(
"Action?is?taken?here");
????}

}
請求者:
package?command;
public?class?Invoker{
????
//命令
????private?Command?command;
????
//構造方法
????public?Invoker(Command?command){
????????
this.command=command;
????}

????
//行為方法
????public?void?action(){
????????command.execute();
????}

}
客戶端:
package?command;
public?class?Client{
????
public?static?void?main(String[]?args){
????????Receiver?receiver
=new?Receiver();
????????Command?concreteCommand
=new?ConcreteCommand(receiver);
????????Invoker?invoker
=new?Invoker(concreteCommand);
????????invoker.action();
????}

}
命令模式與責任鏈模式區別:
責任鏈模式使一個特定的請求接收對象對請求與命令的執行變得不確定性.而命令模式使得一個特定的對象對命令的執行變得明顯與確定.

參考資料:《Java與模式》
http://www.jdon.com/designpatterns/command.htm