命令模式是指将一些常用的操作集合封装成一个类,当调用者调用时直接去命令类里面调用,而不是与实际执行命令的执行者交互。实现了调用者与执行者的解耦
/**
* 执行者1
*/
public class Excutor1 {
public void doSomething(){
System.out.println("Excutor1在执行doSomething");
}
public void undo(){
System.out.println("Excutor1在执行undo");
}
}
/**
* 执行者2
*/
public class Excutor2 {
public void doSomething(){
System.out.println("Excutor2在执行doSomething");
}
public void undo(){
System.out.println("Excutor2在执行undo");
}
}
/**
* 执行者3
*/
public class Excutor3 {
public void doSomething(){
System.out.println("Excutor3在执行doSomething");
}
public void undo(){
System.out.println("Excutor3在执行undo");
}
}
/**
* 命令接口,所有的命令都要实现这个接口
* */
public interface Command {
//执行
public void excute();
//回滚
public void rollback();
}
/**
* 插入命令
* */
public class InsertCommand implements Command{
Excutor1 excutor1;
Excutor2 excutor2;
public InsertCommand(Excutor1 excutor1,Excutor2 excutor2){
this.excutor1 = excutor1;
this.excutor2 = excutor2;
};
@Override
public void excute() {
excutor1.doSomething();
excutor2.doSomething();
}
@Override
public void rollback() {
excutor2.undo();
excutor1.undo();
}
}
/**
* 删除命令
* */
public class DeleteCommand implements Command{
Excutor3 excutor3;
Excutor2 excutor2;
public DeleteCommand(Excutor3 excutor3, Excutor2 excutor2){
this.excutor3 = excutor3;
this.excutor2 = excutor2;
};
@Override
public void excute() {
excutor3.doSomething();
excutor2.doSomething();
}
@Override
public void rollback() {
excutor2.undo();
excutor3.undo();
}
}
/**
* 调用者
* */
public class Caller {
Command[] c;
public Caller(Command[] c){
this.c = c;
}
}
public class Main {
public static void main(String[] args) {
//准备好命令集
Command[] commands = new Command[3];
commands[0] = new InsertCommand(new Excutor1(),new Excutor2());
commands[1] = new DeleteCommand(new Excutor3(),new Excutor2());
//创建调用者,把命令集传进去
Caller caller = new Caller(commands);
//执行插入命令
Command c1 = caller.c[0];
c1.excute();
//执行删除命令
Command c2 = caller.c[1];
c2.excute();
//执行回滚
Command c3 = caller.c[0];
Command c4 = caller.c[1];
c3.rollback();
c4.rollback();
}
}
可以看到,经过命令类的封装,实现了调用者caller和执行者Excutor之间的解耦,常用于一个系统中常用且不变的处理方式。其作用类似于工具类,拿来即用。