(18)命令模式
概念
- 老师发布打开课本的命令,学生听到这个命令就打开课本。老师发布阅读的命令,学生听到命令后就开始阅读。
- 如果用普通的方式去写代码,那么老师和学生之间就存耦合关系。比如老师直接调用学生的打开课本方法,学生就打开课本。老师调用学生的阅读方法,学生就开始阅读。这样老师和学生就存在耦合关系。
- 而命令模式主要为了让老师和学生之间解耦。比如老师不操作学生的打开课本方法,而是老师发布一条命令,然后学生就根据命令去执行。
- 简单的说,就是老师和学生是没有任何关系的,老师要操作学生的方法,需要通过一个命令去操作学生的方法。【命令模式可将“动作的请求者(老师)”从“动作的执行者(学生)”解耦出来】
实现方式
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* 命令
*/
public class Demo {
public static void main(String[] args) {
List<Student> stuList = IntStream.range(0, 5)
.mapToObj(i -> new Student("张三" + i))
.collect(Collectors.toList());
// 创建一个命令,命令由多个学生去执行
StudentCommand studentCommand = new StudentCommand(stuList);
Thacher thacher = new Thacher();
System.out.println("========= 老师发布打开课本命令 =========");
thacher.openBookCommand(studentCommand);
System.out.println("========= 老师发布阅读命令 =========");
thacher.readCommand(studentCommand);
}
}
// 命令接口,所有命令都要实现该接口
interface Command {
void openBook();
void read();
}
// 具体的命令
class StudentCommand implements Command {
// 多个学生,老师发布一条命令,多个学生都要执行
List<Student> stuList;
public StudentCommand(List<Student> stuList) {
this.stuList = stuList;
}
@Override
public void openBook() {
stuList.forEach(Student::openBook);
}
@Override
public void read() {
stuList.forEach(Student::read);
}
}
// 学生(命令的接受者)
class Student {
String name;
public Student(String name) {
this.name = name;
}
public void openBook() {
System.out.println("学生 " + name + " 打开了课本");
}
public void read() {
System.out.println("学生 " + name + " 开始读书");
}
}
// 老师(命令的发布者)
class Thacher {
public void openBookCommand(Command command) {
command.openBook();
}
public void readCommand(Command command) {
command.read();
}
}
========= 老师发布打开课本命令 =========
学生 张三0 打开了课本
学生 张三1 打开了课本
学生 张三2 打开了课本
学生 张三3 打开了课本
学生 张三4 打开了课本
========= 老师发布阅读命令 =========
学生 张三0 开始读书
学生 张三1 开始读书
学生 张三2 开始读书
学生 张三3 开始读书
学生 张三4 开始读书