技术交流群:365814763
设计模式之命令模式(撤销undo模式)
定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作
设计模式之命令模式是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对
象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
涉及对象:
1、Receiver 命令接收者
2、Command 命令
3、LinghtONCommand 具体命令
4、Invoker 调用命令者
5、Client 可以设置命令与命令接受者
测试,模拟电灯开关
类之间关系:
具体实现(Command可以为接口类,也可以为抽象类):
public class CommondPattern {
public static void main(String[] args) {
//Receiver 命令接受者
Linght linght = new Linght();
//具体命令
Command linghtONCommand = new LinghtONCommand(linght);
Command linghtOFFCommand = new LinghtOFFCommand(linght);
//命令调用者
Invoker invoker = new Invoker();
invoker.setCommand(linghtONCommand);
//执行命令
invoker.execute();
invoker.setCommand(linghtOFFCommand);
invoker.execute();
}
}
abstract class Command {
abstract void execute();
}
class Linght {
public void on() {
System.out.println("灯打开了============");
}
public void off() {
System.out.println("灯关闭了============");
}
}
class LinghtONCommand extends Command {
private Linght linght;
public LinghtONCommand(Linght linght) {
this.linght = linght;
}
@Override
void execute() {
linght.on();
}
}
class LinghtOFFCommand extends Command {
private Linght linght;
public LinghtOFFCommand(Linght linght) {
this.linght = linght;
}
@Override
void execute() {
linght.off();
}
}
class Invoker {
Command command;
public Command getCommand() {
return this.command;
}
public void setCommand(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
}
命令模式可以撤销,实现方式就是在抽象类中加入一个undo()方法,在具体类中实现undo()方法的具体操作即可。即在调
用命令时,保留调用命令,执行撤销命令(undo)时,调用保留的命令状态。
总结:
1、命令模式将发出请求的兑现和执行请求的对象解耦。
2、在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接收者和一个或者一组动作。
3、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用。
4、调用者可以接受命令当做参数,甚至在运行时动态地进行。
5、命令可以支持撤销,做法是实现一个undo()方法回到execute()被执行前的状态。
命令模式也可以用来实现日志和事务系统。