版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/85402720
介绍
- 命令模式:将一个请求封装为一个对象 , 从而使我们可用不同的请求对客户端进行参数化 , 对请求排队或记录请求日志 , 以及支持可撤销的操作 。 也称之为 : 动作Action模式 , 事物transction模式
结构
- Command 抽象命令类
- ConcreteCommand 具体命令类
- Invoker 调用者/请求者
- -- 请求的发送者 , 它通过命令对象来执行请求 。一个调用者并不需要再设计时确定确定其接受者,因此它只与抽象命令类之间存在关联。在程序运行时,将调用命令对象的executer() , 间接调用接受者的相关操作。
- Receiver 接受者
- 接受者执行与请求相关的操作 , 具体实现对请求的业务处理。
- 未抽象前, 实际执行操作内容的对象。
- Client客户类
- 在客户类中需要创建调用者对象 ,具体命令类对象, 在创建具体命令对象时指定对应的接受者 。发送者和接受者之间没有存在直接关系 , 都通过命令对象间接调用。
uml类图如下
1),创建具体命令执行者对象类
package com.tuogo.command;
/**真正命令的执行者
* @author 晓电脑
*/
public class Receive {
public void action(){
System.out.println("方法已经被执行");
}
}
2),创建Command类和它的实现类
package com.tuogo.command;
/**命令抽象类
* @author 晓电脑
*/
public interface Command {
/**
* 这个方法是一个返回结果为空的方法
* 在实际项目中,可以根据需求设计多个不同的方法
*/
void excute();
}
class ConcreateCommand implements Command {
/**
* 真正命令的执行者
*/
private Receive receive;
public ConcreateCommand(Receive receive) {
this.receive = receive;
}
@Override
public void excute() {
//System.out.println("命令执行前增加自己的业务方法");
receive.action();
//System.out.println("命令执行后增加自己的业务方法");
}
}
3),创建Invoker类
package com.tuogo.command;
/**调用者/发起者
* @author 晓电脑
*/
public class Invoker {
/**
* 也可以通过List<Command> 容纳很多命令对象 进行批量处理
* 数据库底层的事物管理就是类似于这样的结构
*/
private Command command;
public Invoker(Command command) {
this.command = command;
}
/**
* 业务方法 用于调用命令类的方法
*/
public void look() {
command.excute();
}
}
4),创建客户端进行测试
/**客户端测试类
* @author 晓电脑
*/
public class Client {
public static void main (String[] args) {
ConcreateCommand command = new ConcreateCommand(new Receive());
Invoker invoker = new Invoker(command);
invoker.look();
//也可以直接使用 但是这样程序就很难进行扩展,不适用于程序的各种变化
// new Receive().action();
}
}
运行结果如下
命令模式在开发中常见的场景:
- Struts2 中,action的整个调用过程中就有命令模式。
- 数据库事物机制的底层实现。
- 命令的撤销和恢复。