一、定义
将“请求”封装成对象,以便使用不同的请求
命令模式解决了应用程序中对象的职责以及它们之间的通信方式。(发送者和接收者完全解耦)
类型:行为型
二、适用场景
1、请求调用者和请求接收者需要解耦,使得调用者和接收者不直接交互。
2、需要抽象出等待执行的行为
三、优点
1、降低耦合
2、容易扩展新命令或者一组命令
四、缺点
1、命令的无限扩展会增加类的数量,提高系统实现复杂度
五、命令模式-相关设计模式
1、命令模式和备忘录模式
两者可以结合起来,例如备忘录模式可以保存命令的历史记录。
六、Coding
场景:通过命令关闭课程某一部分或者某一小节
1、Command 接口
public interface Command {
void execute();
}
2、CourseVideo 类
public class CourseVideo {
private String name;
public CourseVideo(String name) {
this.name = name;
}
public void open(){
System.out.println(this.name +"课程视频开发");
}
public void close(){
System.out.println(this.name +"课程视频关闭");
}
}
3、OpenCourseVideoComand 打开课程权限为免费命令
public class OpenCourseVideoComand implements Command{
private CourseVideo courseVideo;
public OpenCourseVideoComand(CourseVideo courseVideo) {
this.courseVideo = courseVideo;
}
@Override
public void execute() {
this.courseVideo.open();
}
}
4、CloseCourseVideoCommand 关闭课程权限为免费命令
public class CloseCourseVideoCommand implements Command{
public CourseVideo courseVideo;
public CloseCourseVideoCommand(CourseVideo courseVideo) {
this.courseVideo = courseVideo;
}
@Override
public void execute() {
this.courseVideo.close();
}
}
5、员工类
/**
* 员工类
*/
public class Staff {
private List<Command> commandList = new ArrayList<>();
public void addCommand(Command command){
commandList.add(command);
}
public void executeCommands(){
for(Command command: commandList){
command.execute();
}
commandList.clear();
}
}
6、UML图

7、测试
public class Test {
public static void main(String[] args) {
CourseVideo courseVideo = new CourseVideo("Java设计模式");
OpenCourseVideoComand openCourseVideoComand = new OpenCourseVideoComand(courseVideo);
CloseCourseVideoCommand closeCourseVideoCommand = new CloseCourseVideoCommand(courseVideo);
Staff staff = new Staff();
//老板下命令:开发视频课程
staff.addCommand(openCourseVideoComand);
//老板下命令:关闭视频课程
staff.addCommand(closeCourseVideoCommand);
staff.executeCommands();
}
}
结果:
Java设计模式课程视频开放 Java设计模式课程视频关闭
八、命令模式在源码中的应用
1、Runnable
可以理解为抽象的命令

Runnable的实现,可以理解为具体实现的命令。
2、junit.framework下的Test接口

run方法,可以理解为命令模式的execute方法。