命令模式(Command Pattern):
定義
命令模式(Command Pattern):將一個請求封裝爲一個對象,從而你可以用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作。
使用場景
在某些場合,比如要對行爲進行"記錄、撤銷/重做、事務"等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將"行爲請求者"與"行爲實現者"解耦?將一組行爲抽象爲對象,可以實現二者之間的松耦合
命令模式(Command)模式的組成
客戶角色:定創建一個具體命令對象,並確定其接收者。
命令角色:申明一個給所有具體命令類的抽象接口,這是一個抽象角色,通常由一個接口或者抽象類實現。
具體命令角色:定義一個接收者和行爲之間的弱耦合,實現execute方法(執行方法,方法名可以自定義),負責調用接收者的相應操作。
請求者角色:負責調用命令對象執行請求。實際應用中一般需要實現對命令和接收者進行匹配分發處理。
接收者角色:負責具體實施和執行一個請求。
代碼實現(Java實現)
命令角色:
package pattern.command;
public interface Command {
public void execute();
}
接收者角色:
package pattern.command;
public class Receiver {
public void doAction() {
System.out.println("執行操作");
}
}
具體命令角色:
package pattern.command;
public class ConcreteCommand implements Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.doAction();
}
}
請求者角色:
package pattern.command;
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void doInvokerAction() {
command.execute();
}
}
客戶角色:
package pattern.command;
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.doInvokerAction();
}
}