一、簡介
命令模式把一個請求或者操作封裝到一個對象中恬砂。命令模式允許系統(tǒng)使用不同的請求把客戶端參數(shù)化袒炉,對請求排隊或者記錄請求日志,可以提供命令的撤銷和恢復(fù)功能柴钻。
命令模式的四個角色:
1.命令(Command)角色:聲明了一個給所有具體命令類的抽象接口。
2.具體命令(ConcreteCommand)角色:定義一個接收者和行為之間的弱耦合;實現(xiàn)execute()方法,負(fù)責(zé)調(diào)用接收者的相應(yīng)操作纵装。execute()方法通常叫做執(zhí)行方法。
3.請求者(Invoker)角色:負(fù)責(zé)調(diào)用命令對象執(zhí)行請求据某,相關(guān)的方法叫做行動方法。
4.接收者(Receiver)角色:負(fù)責(zé)具體實施和執(zhí)行一個請求诗箍。任何一個類都可以成為接收者癣籽,實施和執(zhí)行請求的方法叫做行動方法。
二滤祖、代碼示例
1.接收者
<code>public class Receiver {
//真正執(zhí)行命令相應(yīng)的操作
public void action(){
System.out.println("執(zhí)行操作");
}
}</code>
2.抽象命令
<code>public interface Command {
//執(zhí)行方法
void execute();
}</code>
3.具體命令
<code>public class ConcreteCommand implements Command {
//持有相應(yīng)的接收者對象
private Receiver receiver = null;
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
//通常會轉(zhuǎn)調(diào)接收者對象的相應(yīng)方法筷狼,讓接收者來真正執(zhí)行功能
receiver.action();
}
}</code>
4.請求者
<code>public class Invoker {
//持有命令對象
private Command command = null;
//構(gòu)造方法
public Invoker(Command command){
this.command = command;
}
//行動方法
public void action(){
command.execute();
}
}</code>
三、意義
更松散的耦合匠童,命令模式使得發(fā)起命令的對象——客戶端埂材,和具體實現(xiàn)命令的對象——接收者對象完全解耦,也就是說發(fā)起命令的對象完全不知道具體實現(xiàn)對象是誰汤求,也不知道如何實現(xiàn)俏险。
更動態(tài)的控制,命令模式把請求封裝起來扬绪,可以動態(tài)地對它進(jìn)行參數(shù)化竖独、隊列化和日志化等操作,從而使得系統(tǒng)更靈活挤牛。
很自然的復(fù)合命令莹痢,命令模式中的命令對象能夠很容易地組合成復(fù)合命令,也就是宏命令,從而使系統(tǒng)操作更簡單竞膳,功能更強(qiáng)大航瞭。
更好的擴(kuò)展性,由于發(fā)起命令的對象和具體的實現(xiàn)完全解耦坦辟,因此擴(kuò)展新的命令就很容易沧奴,只需要實現(xiàn)新的命令對象,然后在裝配的時候长窄,把具體的實現(xiàn)對象設(shè)置到命令對象中滔吠,然后就可以使用這個命令對象,已有的實現(xiàn)完全不用變化挠日。