通过将一系列的操作封装成一个命令对象,方便执行,同时也能够很好的让我们进行一些操作回滚,用来记录是否执行过该操作等问题。
我们将某些操作封装成一个Command命令,每个命令对应一个操作,如下图所示:
Command
public interface Command {
void execute();
}
ConcreteCommand
public class ConcreteCommand implements Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
this.receiver.action();
}
}
Receiver
public class Receiver {
public void action() {
System.out.println("执行动作");
}
}
这样我们就可以通过命令的方式来对我们的操作进行管理了。
上面已经把我们的操作抽象为命令的方式,每个命令对应一个行为操作,下面就是对命令的触发了。我们通过一个单独的类来对命令进行管理和触发。
Invoker
public class Invoker {
private Command command;
// 这里凡是继承 Command 接口的类都可以以参数的形式传入
public void setCommand(Command command) {
this.command = command;
}
public void action() {
this.command.execute(); // 而所有继承自 Command 接口的类都必须实现 execute() 这个方法
}
}
这样就形成了整个命令模式。
Client
public class Client {
public static void main(String args[]) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.action();
}
}
Android中的命令模式
Android中的Runnable就是一种命令模式。例如:
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
跟上面相比,命令的行为这里直接写在命令中,并没有单独为命令写一个行为对象。