在开发中,方法的请求与方法的执行往往存在紧密耦合关系,不利于系统的维护。命令模式就是为了解决这个问题而出现的。
什么是命令模式
“命令模式是一个高内聚的模式,其定义为:Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)
”
下面为命令模式的通用类图:
命令模式
命令模式主要由3个要素组成:
“”
Receive接收者:接收命令
Command命令角色:封装要执行的命令
Invoker调用者:执行命令
代码实现
首先创建一个抽象接收者Receiver
public abstract class Receiver {
//抽象接收者,定义每个接收者都必须完成的业务
public abstract void doSomething();
}
再创建一个Receiver
的实现类ConcreteReceiver1
。实现类可以有多个,如还可以创建ConcreteReceiver2
。
public class ConcreteReceiver1 extends Receiver {
@Override
public void doSomething() {
Console.log("执行ConcreteReceiver1的方法...");
}
}
public class ConcreteReceiver2 extends Receiver {
@Override
public void doSomething() {
Console.log("执行ConcreteReceiver2的方法...");
}
}
然后创建命令类抽象Command
public abstract class Command {
//每个命令类都必须有一个执行命令的方法
public abstract void execute();
}
同Receiver
一样,Command
也可以有很多实现类。
public class ConcreteCommand1 extends Command {
//对哪个Receiver类进行命令处理
private Receiver receiver;
//构造函数传递接收者
public ConcreteCommand1(Receiver _receiver) {
this.receiver = _receiver;
}
//必须实现一个命令
@Override
public void execute() {
//业务处理
this.receiver.doSomething();
}
}
public class ConcreteCommand2 extends Command {
//对哪个Receiver类进行命令处理
private Receiver receiver;
//构造函数传递接收者
public ConcreteCommand2(Receiver _receiver) {
this.receiver = _receiver;
}
//必须实现一个命令
@Override
public void execute() {
//业务处理
this.receiver.doSomething();
}
}
创建调用者Invoker
public class Invoker {
private Command command;
//接受命令
public void setCommand(Command _command) {
this.command = _command;
}
//执行命令
public void action() {
this.command.execute();
}
}
测试:
@Test
public void test() {
//首先声明调用者Invoker
Invoker invoker = new Invoker();
//定义接收者
Receiver receiver = new ConcreteReceiver1();
//定义一个发送给接收者的命令
Command command = new ConcreteCommand1(receiver);
//把命令交给调用者去执行
invoker.setCommand(command);
invoker.action();
}
测试结果:
执行ConcreteReceiver1的方法...
这里Receiver
里面的方法就是我们需要用的方法,这个方法由Command
获取封装,Invoker
去执行。
关于命令模式的思考
调用者不直接调用接收者的方法,而是去调用Command
的execute()
。对于调用者来说,它不需要知道接收者是谁。
一般来说,命令模式结合其他设计模式,会有更好的效果。
但是命令模式中Command也不能无限扩展,如果有N个命令,那就会有N个Command子类,这样也不是很好。
往期推荐
扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料
1.回复"java" 获取java电子书;
2.回复"python"获取python电子书;
3.回复"算法"获取算法电子书;
4.回复"大数据"获取大数据电子书;
5.回复"spring"获取SpringBoot的学习视频。
6.回复"面试"获取一线大厂面试资料
7.回复"进阶之路"获取Java进阶之路的思维导图
8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)
9.回复"总结"获取Java后端面试经验总结PDF版
10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)
11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)
另:点击【我的福利】有更多惊喜哦。