設計模式 命令模式

2021-08-03 21:27:11 字數 3869 閱讀 7544

命令模式

將「請求」封裝成物件,以便使用不同的請求、佇列或者日誌來引數化其他物件。支援可撤銷操作。

命令可以將不同運算塊打包,許久之後,運算依然可以被呼叫。衍生一些應用,如: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...