定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
命令模式涉及的角色:
1.Command:抽象命令类
定义命令的接口,声明执行的方法。
2.ConcreteCommand:具体命令类
命令接口实现对象,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
3.Receiver:接收者
接收者,真正执行命令的对象。
4.Invoker:调用者
要求命令对象执行请求,通常会持有命令对象,可以持有多个命令对象。
5.Client:
创建具体的命令对象,并且设置命令对象的接收者。
以下以客户要求打扫卫生为例,解析命令模式。客户要求打扫卫生,往往先找到经理,给经理下命令,经理接到命令,让保洁员去执行命令。在此,客户是Client,经理是Invoker,保洁员是Receiver,具体清洁命令是ConcreteCommand。
Command,抽象命令类
package com.example.command;
public interface Command {
void clean();
void undoClean();
}
具体命令类
package com.example.command;
public class CleanRoomCommand implements Command{
private Cleaner cleaner;
public CleanRoomCommand(Cleaner cleaner) {
this.cleaner = cleaner;
}
@Override
public void clean() {
cleaner.clean("打扫房间");
}
@Override
public void undoClean() {
cleaner.undoClean();
}
}
保洁员(接收者)
package com.example.command;
public class Cleaner {
public void clean(String workContent){
System.out.println(workContent);
}
public void undoClean(){
System.out.println("放弃打扫卫生");
}
}
经理(调用者)
package com.example.command;
public class Manager {
private Command command;
public Manager(Command command) {
super();
this.command = command;
}
public void clean(){
command.clean();
}
}
客户
package com.example.command;
public class Client {
public static void main(String[] args) {
Cleaner cleaner = new Cleaner();
Manager manager = new Manager(new CleanRoomCommand(cleaner));
manager.clean();
}
}
打印结果
打扫房间