命令模式用得比較少,一般都是在實際項目開發的後發現需要用的時候我們通過重構來實現。在現實生活中,我們也用這個設計模式;例如:咱們去餐館點菜的時,服務員美眉會給我們簡紹些好喫的菜,若點菜時,廚房沒有了會提示我們;喫飯到中途時,菜多可撤銷、菜少可添加。我們不需要關心具體是哪個大廚炒菜。這個就是我們今天要講的設計模式----命令模式。
將一個請求封裝成一個對象,從而使得你可用不同的請求對客戶需求進行參數化,對請求排隊或者記錄日誌;以及支持可撤銷的操作。
我們來看看命令類(Command),命令應是命令誰做啥事。所以,我們在命令類中需要定義一個接受者的對象:
abstract class Command
{
//在這個地方定義一個接受者,並且後續繼承中執行對應的方法
protected Receiver receiver;
public Command(Receiver receiver)
{
this.receiver=receiver;
}
abstract void Execute();
}
class ConcreteCommand:Command
{
public ConcreteCommand(Receiver receiver):base(Receiver receiver)
{}
public override void Execute()
{
//執行命令,則是轉到執行接受者對象 對應的命令
receiver.Action();
}
}
class Invoker
{
//針對項目的實際需要,我們可以定義成一個list ,可以增加、刪除等
private Command command;
public void SetCommand(Command command)
{
this.command=command;
}
public void ExecuteCommand()
{
//若爲一組命令,則循環調用並執行
command.Execute();
}
}
命令廚師炒菜,那麼廚師本身的任務就是執行炒菜;至於怎麼炒菜由廚師自己掌控;
class Receiver
{
public void Action()
{
Console.WriteLine("根據用戶的需要執行,對象的操作!");
}
}
客戶端代碼:
static void Main(string[] arg)
{
Receiver receiver=new Receiver();
Invoker invoker=new Invoker();
//具體的命令,帶有命令誰做啥
ConcreteCommand concretecommand=new ConcreteCommand(receiver);
//1.先負責接收命令
invoker.SetCommand(concretecommand);
//2.通知接收者進行對應的操作
invoker.ExecuteCommand();
}
代碼無高深之處,僅供和大家一起學習使用。