目录
一、命令模式的定义与类型
- 一、命令模式的定义与类型
- 二、命令模式的适用场景
- 三、命令模式的优点
- 四、命令模式的缺点
- 五、命令模式相关设计模式
- 六、命令模式示例
1、定义
- 将"请求"封装成对象,以便使用不同的请求
- 命令模式解决了应用程序中对象的职责以及他们之间的通信方式
2、类型
- 行为型
- 请求的调用者和请求接收者需要解耦,使得调用者和接收者不直接交互
- 需要抽象出等待执行的行为
- 降低耦合
- 容易扩展新命令或者一组命令
- 命令的无限扩展会增加类的数量,提高系统实现复杂度
- 命令模式和备忘录模式
以网站上课程视频的开放和关闭为例进行代码演示
1、代码结构如下:
2、定义一个命令接口类
package com.rf.designPatterns.behavioral.command;
/**
* @description: 定义一个命令接口类
* @author: xz
*/
public interface Command {
//执行命令的方法
void excute();
}
3、定义一个课程视频类
package com.rf.designPatterns.behavioral.command;
/**
* @description: 定义一个课程视频类
* @author: xz
*/
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+"课程视频关闭");
}
}
4、定义一个开启课程视频命令类
package com.rf.designPatterns.behavioral.command;
/**
* @description: 定义一个开启课程视频命令类
* @author: xz
*/
public class OpenCourseVideoCommand implements Command{
//通过构造器注入
private CourseVideo courseVideo;
public OpenCourseVideoCommand(CourseVideo courseVideo) {
this.courseVideo = courseVideo;
}
//重写excute方法
@Override
public void excute() {
courseVideo.open();
}
}
5、定义一个关闭视频课程命令类
package com.rf.designPatterns.behavioral.command;
/**
* @description: 定义一个关闭视频课程命令类
* @author: xz
*/
public class CloseCourseVideoCommand implements Command{
//通过构造器注入
private CourseVideo courseVideo;
public CloseCourseVideoCommand(CourseVideo courseVideo) {
this.courseVideo = courseVideo;
}
//重写excute方法
@Override
public void excute() {
courseVideo.close();
}
}
6、定义一个人员类,执行命令
package com.rf.designPatterns.behavioral.command;
import java.util.ArrayList;
import java.util.List;
/**
* @description: 定义一个人员类,执行命令
* @author: xz
*/
public class Person {
private List list=new ArrayList();
//添加命令方法
public void addCommand(Command command){
list.add(command);
}
//执行命令方法
public void executeCommand(){
//遍历执行命令方法
for(Command command: list ){
command.excute();
}
//执行完命令后清空命令
list.clear();
}
}
7、定义一个命令模式的测试类
package com.rf.designPatterns.behavioral.command;
/**
* @description: 定义一个命令模式的测试类
* @author: xz
*/
public class Test {
public static void main(String[] args) {
//创建课程视频
CourseVideo courseVideo = new CourseVideo("java设计模式");
//创建开启课程视频命令
OpenCourseVideoCommand openCourseVideoCommand = new OpenCourseVideoCommand(courseVideo);
//创建关闭课程视频命令
CloseCourseVideoCommand closeCourseVideoCommand = new CloseCourseVideoCommand(courseVideo);
Person person = new Person();
//接收到2条命令
person.addCommand(openCourseVideoCommand);
person.addCommand(closeCourseVideoCommand);
//具体执行命令
person.executeCommand();
}
}
8、运行测试类,效果如下图: 9、UML类图如下: