命令模式就是將一組操作得調用封裝在一個對象裏面,這個對象稱作命令對象。
例如我們可以有一個專門用於開啓、關閉電器的命令,通過調用這命令就可以開關電器。
system start 冰箱
system close 冰箱
system start 空調
system close 空調
那麼我們可以寫一個關於電器的命令類,在創建對象的時候可以與具體電器的組合實現對具體電器的控制。
也就是我們為您可以將system start 和system close封裝到一個對象中,然後對象可以與空調、冰箱等家電組合實現system close 空調的功能。
在命令模式中有以下角色
- 抽象命令:所有命令的父類,定義執行命令的抽象接口,並且聲明被調用者成員與命令綁定。
- 具體命令:實現具體的執行細節。
- 抽象被調用者:定義被調用者可被調用的功能方法。
- 具體調用者:實現具體產品的被調用方法的具體細節。
- 調用者:設置具體的調用命令,並實現調用方法。
下面通過一個軟件的實例來實現命令模式
抽象命令
public abstract class Command {
Software software;
public Command(Software software) {
this.software = software;
}
abstract void execute();
}
具體命令 - 開、操作、關
public class OpenSoftwareCommand extends Command{
public OpenSoftwareCommand(Software software) {
super(software);
}
@Override
void execute() {
software.open();
}
}
public class OperateSoftwareCommand extends Command{
public OperateSoftwareCommand(Software software) {
super(software);
}
@Override
void execute() {
software.operate();
}
}
public class CloseSoftwareCommand extends Command{
public CloseSoftwareCommand(Software software) {
super(software);
}
@Override
void execute() {
software.close();
}
}
抽象被調用者 - 軟件
public interface Software {
/**
* 打開軟件
*/
void open();
/**
* 操作軟件
*/
void operate();
/**
* 關閉軟件
*/
void close();
}
具體被調用者 - 微信
public class Wechat implements Software{
@Override
public void open() {
System.out.println("打開微信");
}
@Override
public void operate() {
System.out.println("微信聊天");
}
@Override
public void close() {
System.out.println("推出微信");
}
}
調用者
public class Invoker {
Command command;
public Invoker() {
}
public void setCommand(Command command) {
this.command = command;
}
public void execute(){
command.execute();
}
}
測試
public class CommandTest {
@Test
public void test(){
Invoker invoker = new Invoker();
Command command = new OpenSoftwareCommand(new Wechat());
invoker.setCommand(command);
invoker.execute();
command = new OperateSoftwareCommand(new Wechat());
invoker.setCommand(command);
invoker.execute();
}
}
======結果======
打開微信
微信聊天