客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。
命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。
请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
接收者(Receiver)角色:负责具体实施和执行一个请求。
三. 实现
假设一个老师可以命令学生执行完成作业和叫家长两项操作,而告知学生的手段是通过班长转达,那么这就形成了命令模式,老师为客户角色,学生为接收者,班长则为请求者角色。
Teacher.java
public class Teacher {
public static void main(String[] args) {
Monitor monitor = new Monitor();
Student like = new Student();
Student sb = new Student();
Command callParentCommand = new CallParentCommand(sb);
Command finishHomeWorkCommand = new FinishHomeworkCommand(like);
monitor.addCommands(callParentCommand, finishHomeWorkCommand);
monitor.action();
monitor.undo(callParentCommand);
monitor.action();
}
}
指明了接收者分别为like 和 sb,并利用班长将具体命令组成集合统一执行。
Student.java
public class Student {
public void finishHomework() {
System.out.println("把作业做完");
}
public void callParent(){
System.out.println("把家长叫过来");
}
}
学生类,里面有完成作业和叫家长两个方法。
Monitor.java
public class Monitor {
private List<Command> commands = new ArrayList<Command>();
public void addCommands(Command... commands){
for(Command command : commands){
this.commands.add(command);
}
}
public void action(){
for(Command command : commands){
command.execute();
}
}
public void undo(Command command){
System.out.println("饶了你");
this.commands.remove(command);
}
}
班长类,其主要负责添加、删除命令并执行。
Command.java
public interface Command {
public void execute();
}
命令接口。
CallParentCommand.java
public class CallParentCommand implements Command {
private Student student;
public CallParentCommand(Student student){
this.student = student;
}
@Override
public void execute() {
student.callParent();
}
}
叫家长具体命令,其引用了Student类,并调用接收者的操作。
FinishHomeworkCommand.java
public class FinishHomeworkCommand implements Command {
private Student student;
public FinishHomeworkCommand(Student student){
this.student = student;
}
@Override
public void execute() {
student.finishHomework();
}
}
同上