一、定义与类型:
》定义:将“请求”封装成对象,以便使用不同的请求
把不同点请求封装成不同的请求对象,接收者都可以识别,执行不同的行为。比如老板给员工下不同的命令,员工都能接收并执行。
》命令模式解决了应用程序中对象的职责以及它们之间的通信方式;老板只负责下命令,不关心如何实现。员工只需要知道执行什么工作就好。
二、适用场景:
》请求调用者和请求接收者需要解耦,使得调用者和接收者不直接交互。
》需要抽象出等待执行的行为。
三、优点:
》降低耦合
》容易扩展新命令或者一组命令。
四、缺点:
》命令的无线扩展会增加类的数量,提高系统实现复杂度。
五、相关设计模式:
》命令模式和备忘录模式:备忘录模式来保存命令的历史记录,这样就可以方便地调用之前存储的某个命令,
六、代码实践:
以老板让员工执行把网络视频课向外公开 和关闭两个命令为例。
package pattern.behaviral.command;
/**
* Created by Administrator on 2019/8/31.
*/
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+"课程视频关闭");
}
}
package pattern.behaviral.command;
/**
* Created by Administrator on 2019/8/31.
*/
public interface Command {
void execute();
}
package pattern.behaviral.command;
/**
* Created by Administrator on 2019/8/31.
*/
public class OpenCourseVideoCommand implements Command {
private CourseVideo courseVideo;
public OpenCourseVideoCommand(CourseVideo courseVideo) {
this.courseVideo = courseVideo;
}
public void execute() {
courseVideo.open();
}
}
package pattern.behaviral.command;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by Administrator on 2019/8/31.
*/
public class CloseCourseVideoCommand implements Command {
private CourseVideo courseVideo;
public CloseCourseVideoCommand(CourseVideo courseVideo) {
this.courseVideo = courseVideo;
}
public void execute() {
courseVideo.close();
}
}
package pattern.behaviral.command;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2019/8/31.
*/
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();
}
}
package pattern.behaviral.command;
/**
* Created by Administrator on 2019/8/31.
*/
public class Test {
public static void main(String[] args) {
CourseVideo courseVideo = new CourseVideo("java设计模式 --By Geely");
OpenCourseVideoCommand openCourseVideoCommand = new OpenCourseVideoCommand(courseVideo);
CloseCourseVideoCommand closeCourseVideoCommand = new CloseCourseVideoCommand(courseVideo);
Staff staff = new Staff();
staff.addCommand(openCourseVideoCommand);
staff.addCommand(closeCourseVideoCommand);
staff.executeCommands();
}
}
"D:\Program Files\Java\jdk1.8.0_102\bin\java" "-javaagent:D:\InteliijIDea\IntelliJ IDEA 2017.1.4\lib\idea_rt.jar=50893:D:\InteliijIDea\IntelliJ IDEA 2017.1.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_102\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar;E:\JavaDesignMode\target\classes" pattern.behaviral.command.Test
java设计模式 --By Geely课程视频开放
java设计模式 --By Geely课程视频关闭
Process finished with exit code 0
七、源码解析:
jdk中多线程中的Runnable 中 run()方法,放在其中的内容,相当于多个不同的命令。
spring源码中,单元测试Junit中的Test TestCase类,其中也有run方法。