命令模式

2018-12-09  本文已影响5人  满天星爱我

定义

将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作

要点

案例

public interface Command {
    //执行命令
    void execute();
    //撤销命令
    void undo();
}
public class Receiver {

public void sendData(){
    System.out.println("发送数据");
}
public void cancelSend(){
    System.out.println("取消发送"); 
}
}
public class ReceiverCommand implements Command {
private Receiver receiver;

public ReceiverCommand(Receiver receiver) {
    this.receiver = receiver;
}

@Override
public void execute() {
    receiver.sendData();
}
@Override
public void undo() {
    receiver.cancelSend();
}
}
public class RequestManager {
Command command;

public void setCommand(Command onCommand) {
    this.command = onCommand;
}

public void executeCommand(){
    this.command.execute();
}
public void undoCommand(){
    this.command.undo();
}
}

通过一个setCommand()方法可以将任何实现了Command接口的命令和请求者绑定起来,这样请求者就可以执行不同的命令,从而让不同的命令去做出不同的动作,而具体做什么是由被封装到命令中的接收者对象去完成的,因此请求者是不知道接收者具体要做什么的。

public class CommandTest {

public static void main(String[] args){
    Receiver receiver = new Receiver();
    ReceiverCommand receiverCommand = new ReceiverCommand(receiver);
    RequestManager requestManager = new RequestManager();
    requestManager.setCommand(receiverCommand);
    requestManager.executeCommand();
    requestManager.undoCommand();
}
}
发送数据
取消发送

宏命令

上面只是定义了一个命令,实际情况中,我们可能会执行一组命令,也就是宏命令。我们来修改RequestManager类,让它可以接收一组命令,代码如下:

public class RequestManager {
Command[] commands;

public void setCommand(Command[] commands) {
    this.commands = commands;
}

public void executeCommand(){
    for (Command command : commands) {
        command.execute();
    }
}
public void undoCommand(){
    for (Command command : commands) {
        command.undo();
    }
}
}

Command声明成数组用来接收一组命令,然后在执行请求的时候去遍历所有的命令执行它们的execute()undo()方法,这样便完成了一组命令的执行。

上一篇 下一篇

猜你喜欢

热点阅读