命令模式
將「請求」封裝成物件,以便使用不同的請求、佇列或者日誌來引數化其他物件。支援可撤銷操作。
命令可以將不同運算塊打包,許久之後,運算依然可以被呼叫。衍生一些應用,如:scheduler、執行緒池、工作佇列等。
日誌請求:將動命令作記錄到日誌中,系統宕機後可以通過重新呼叫這些動作恢復到之前的狀態。
主要解決:在軟體系統中,行為請求者與行為實現者通常是一種緊耦合的關係,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵禦變化的緊耦合的設計就不太合適。
何時使用:在某些場合,比如要對行為進行」記錄、撤銷/重做、事務」等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將」行為請求者」與」行為實現者」解耦?將一組行為抽象為物件,可
優點: 1、降低了系統耦合度。 2、新的命令可以很容易新增到系統中去。
缺點:使用命令模式可能會導致某些系統有過多的具體命令類。
家電遙控器舉例:
public
class
light
public
light(string name)
public
void
on()
public
void
off()
}public
class
garagedoor
public
garagedoor(string name)
public
void
open()
public
void
close()
}public
inte***ce
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()
}public
class
garagedooropencommand
implements
command
@override
public
void
execute()
@override
public
void
undo()
}public
class
garagedoorclosecommand
implements
command
@override
public
void
execute()
@override
public
void
undo()
}//控制多個開關命令
public
class
macrocommand
implements
command
@override
public
void
execute()
}@override
public
void
undo()
}}public
class
nocommand
implements
command
@override
public
void
undo()
}public
class
******remotecontrol
public
void
buttonwaspressed()
}/**
* 遙控器
*/public
class
remotecontrol
undocommand = nocommand;
}public
void
setcommand(int slot, command oncommand, command offcommand)
public
void
onbuttonwaspress(int slot)
public
void
offbuttonwaspress(int slot)
public
void
undobuttonwaspushed()
@override
public string tostring()
return buffer.tostring();
}}public
class
remotecontroltest
}public
class
remoteloader ;
command partyoff = ;
//總控開啟所有電器
macrocommand partyonmacro = new macrocommand(partyon);
//總控關閉所有電器
macrocommand partyoffmacro = new macrocommand(partyoff);
remotecontrol.setcommand(0, livingroomlighton, livingroomlightoff);
remotecontrol.setcommand(1, kitchenlighton, kitchenlightoff);
remotecontrol.setcommand(2, garagedooropen, garagedoorclose);
remotecontrol.setcommand(6, partyonmacro, partyoffmacro);
system.out.println(remotecontrol);
remotecontrol.onbuttonwaspress(0);
remotecontrol.offbuttonwaspress(0);
remotecontrol.onbuttonwaspress(1);
remotecontrol.offbuttonwaspress(1);
remotecontrol.onbuttonwaspress(2);
remotecontrol.offbuttonwaspress(2);
remotecontrol.undobuttonwaspushed();
system.out.println("\n*****====open all*****====");
remotecontrol.onbuttonwaspress(6);
system.out.println("\n*****====close all*****====");
remotecontrol.offbuttonwaspress(6);
system.out.println("\n*****====undo all*****====");
remotecontrol.undobuttonwaspushed();
}}
設計模式 命令設計模式
一句話總結 命令設計模式的實質是將命令定義,命令的執行分離開,從而提公升了系統的解藕性 結構 命令的抽象command 命令的具體實現concretecommand 命令處理者抽象ireceiver 命令處理者的具體實現concretereceiver 命令的呼叫者invoker 客戶端client...
設計模式 命令模式
1 命令模式的角色組成 1 命令角色 command 生命執行操作的介面。介面或抽象類來實現。2 具體命令角色 concrete command 將乙個接收者物件繫結於乙個動作 呼叫接收者相應的操作,以實現命令角色宣告的執行操作的介面。3 客戶角色 client 建立乙個具體命令物件 並可以設定它的...
設計模式 命令模式
1 command.h ifndef command h define command h include include include using namespace std class chef 廚師,具體命令的執行者 class command 命令基類 class makemuttonco...