@[toc]設計模式
命令模式(Command Pattern):將一個請求封裝爲一個對象,使發出請求的責任和執行請求的責任分離,二者之間經過命令對象進行溝通,方便將命令對象進行儲存、傳遞、調用、增長與管理。命令模式別名爲動做(Action)模式或事務(Transaction)模式,屬於對象行爲型模式。bash
命令模式包括以下角色:ui
命令模式的本質:是對命令進行封裝,將發出命令的責任和執行命令的責任分離。this
命令模式的實際執行者是接收者(Receiver),調用者和接收者二者之間經過命令對象進行溝通。spa
命令模式容許請求的一方和接收的一方獨立開來,使得請求的一方沒必要知道接收請求的一方的接口,更沒必要知道請求是怎麼被接收,以及操做是否被執行、什麼時候被執行,以及是怎麼被執行的。設計
典型的命令模式代碼code
抽象命令類:視頻
public abstract class Command
{
public abstract void execute();
}
複製代碼
具體命令類:對象
public class ConcreteCommand extends Command
{
private Receiver receiver;
public void execute()
{
receiver.action();
}
}
複製代碼
調用者Invoker類:接口
public class Invoker
{
private Command command;
public Invoker(Command command)
{
this.command=command;
}
public void setCommand(Command command)
{
this.command=command;
}
//業務方法,用於調用命令類的方法
public void call()
{
command.execute();
}
}
複製代碼
接收者(Receiver)類:
public class Receiver
{
public void action()
{
//具體操做
}
}
複製代碼
例子來自《設計模式》一書
電視機是請求的接收者,遙控器是請求的發送者,遙控器上有一些按鈕,不一樣的按鈕對應電視機的不一樣操做。抽象命令角色由一個命令接口來扮演,有三個具體的命令類實現了抽象命令接口,這三個具體命令類分別表明三種操做:打開電視機、關閉電視機和切換頻道。顯然,電視機遙控器就是一個典型的命令模式應用實例。
抽象命令類:
public interface AbstractCommand
{
public void execute();
}
複製代碼
具體的命令類:
換臺
public class TVChangeCommand implements AbstractCommand
{
private Television tv;
public TVChangeCommand()
{
tv = new Television();
}
public void execute()
{
tv.changeChannel();
}
}
複製代碼
關機
public class TVCloseCommand implements AbstractCommand
{
private Television tv;
public TVCloseCommand()
{
tv = new Television();
}
public void execute()
{
tv.close();
}
}
複製代碼
開機
public class TVOpenCommand implements AbstractCommand
{
private Television tv;
public TVOpenCommand()
{
tv = new Television();
}
public void execute()
{
tv.open();
}
}
複製代碼
接收者Receiver類:
public class Television
{
public void open()
{
System.out.println("打開電視機!");
}
public void close()
{
System.out.println("關閉電視機!");
}
public void changeChannel()
{
System.out.println("切換電視頻道!");
}
}
複製代碼
調用者(Invoker)類
public class Controller
{
private AbstractCommand openCommand,closeCommand,changeCommand;
public Controller(AbstractCommand openCommand,AbstractCommand closeCommand,AbstractCommand changeCommand)
{
this.openCommand=openCommand;
this.closeCommand=closeCommand;
this.changeCommand=changeCommand;
}
public void open()
{
openCommand.execute();
}
public void change()
{
changeCommand.execute();
}
public void close()
{
closeCommand.execute();
}
}
複製代碼