源代码
GitHub源代码
1.本文目标
本文目标是为了让大家认识并理解命令模式
2.基本套路
定义:将请求封装成对象,以便使用不同的请求
类型:行为型
选择关键点:请求者是否不需要关心命令的执行只知道接受者
设计原则:遵循迪米特、开闭原则
使用概率:20%
难度系数:中高
3.适用场景
1.请求的调用者和请求接受者需要解耦,使得调用者和接受者不直接交互
2.需要抽象出等待执行的行为
4.使用步骤
用栗子能更好的说明问题,请继续往下看
5.举个栗子
我们用具体的代码去更好的理解这个设计模式
5.1栗子说明
- 背景:网站上课程是有视频的,免费打开视频让大家看或者关闭这个视频收费才能看
- 目的:用命令模式模拟
5.2使用步骤
实现代码如下:
步骤1.创建命令接口
public interface Command {
void execute();
}
步骤2.创建课程视频
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.创建打开课程视频命令和关闭课程视频命令
public class OpenCourseVideoCommand implements Command {
private CourseVideo courseVideo;
public OpenCourseVideoCommand(CourseVideo courseVideo) {
this.courseVideo = courseVideo;
}
@Override
public void execute() {
courseVideo.open();
}
}
public class CloseCourseVideoCommand implements Command {
private CourseVideo courseVideo;
public CloseCourseVideoCommand(CourseVideo courseVideo) {
this.courseVideo = courseVideo;
}
@Override
public void execute() {
courseVideo.close();
}
}
步骤4. 创建工作人员类可以执行一组命令
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();
}
}
步骤5. 测试
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();
}
6.优点
- 降低耦合
- 容易扩展新命令或者一组命令
7.缺点
- 命令的无限扩展会增加类的数量,提高系统的实现复杂度
8.总结
本文只是对命令模式进行一个分享,接下来会从创建型模式,结构型模式,行为型模式,这三大类展开一个系列分享,大家可以持续进行关注,信仰年輕的设计模式,蟹蟹啦。