1 概念
1 定义
将请求或操作封装成一个对象,从而使不同的请求可以被异步、延迟、排队,或者记录下来以备撤销或重做等操作。
类型:行为型
2 应用场景
- 撤销/重做操作:当需要支持撤销和重做功能时,可以使用命令模式。命令对象可以记录操作的状态和参数,以便在需要时执行撤销操作
- 事务性操作:命令模式可以用于实现事务性操作,即一系列相关操作的执行要么全部成功,要么全部失败。通过将每个操作封装为一个命令对象,可以在需要时执行回滚操作,确保数据的一致性。
- 队列请求:命令模式可以用于构建请求队列。每个命令对象都表示一个请求,并且可以按顺序执行这些请求。这在需要按顺序执行一系列操作的情况下很有用。
3 优缺点
优点:
缺点:
2 代码实现
场景:CEO下达打开课程视频和关闭课程视频的操作的命令,员工执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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+"课程视频关闭"); } }
|
1 2 3
| public interface Command { void execute(); }
|
1 2 3 4 5 6 7 8 9 10 11 12
| public class OpenCourseVideoCommand implements Command { private CourseVideo courseVideo;
public OpenCourseVideoCommand(CourseVideo courseVideo) { this.courseVideo = courseVideo; }
@Override public void execute() { courseVideo.open(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12
| public class CloseCourseVideoCommand implements Command { private CourseVideo courseVideo;
public CloseCourseVideoCommand(CourseVideo courseVideo) { this.courseVideo = courseVideo; }
@Override public void execute() { courseVideo.close(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
public class Staff { private List<Command> commandList = new ArrayList<Command>(); public void addCommand(Command command){ commandList.add(command); }
public void executeCommands(){ for(Command command : commandList){ command.execute(); } commandList.clear(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Test { public static void main(String[] args) { CourseVideo courseVideo = new CourseVideo("Java设计模式精讲"); OpenCourseVideoCommand openCourseVideoCommand = new OpenCourseVideoCommand(courseVideo); CloseCourseVideoCommand closeCourseVideoCommand = new CloseCourseVideoCommand(courseVideo);
Staff staff = new Staff(); staff.addCommand(openCourseVideoCommand); staff.addCommand(closeCourseVideoCommand);
staff.executeCommands(); } }
|
输出:
Java设计模式精讲课程视频开放
Java设计模式精讲课程视频关闭