【导读】这是一个抽象与具体的关系,比如军队中上级命令下级去模拟训练或处理突发情况,这些都属于命令,只是命令的具体内容不同。
一、定义
将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
二、实例
比如日常打杂中,组长需要让打杂人员(例如我)去启动或关闭某个服务器,这就是一组命令,组长与打杂人员之间的介质是命令这个对象。
服务器对象:
代码语言:javascript复制public class Server {
private String name;
public Server(String name) {
this.name = name;
}
}
抽象命令对象:
代码语言:javascript复制public interface Command {
void execute();
}
关闭服务器命令对象:
代码语言:javascript复制public class CloseServerCommand implements Command {
private Server server;
public CloseServerCommand(Server server) {
this.server = server;
}
@Override
public void execute() {
System.out.println("关闭" server.getName() "服务器");
}
}
启动服务器命令对象:
代码语言:javascript复制public class OpenServerCommand implements Command {
private Server server;
public OpenServerCommand(Server server) {
this.server = server;
}
@Override
public void execute() {
System.out.println("打开" server.getName() "服务器");
}
}
具体打杂人员对象:
代码语言:javascript复制public class Worker {
1、包含一组命令
private List<Command> commandList = new ArrayList<Command>();
public void addCommand(Command command) {
commandList.add(command);
}
2、依次执行命令
public void executeCommand() {
for (Command command : commandList) {
command.execute();
}
}
}
测试代码:
代码语言:javascript复制Worker worker = new Worker();
worker.addCommand(new OpenServerCommand(new Server("1.1.1.1")));
worker.addCommand(new CloseServerCommand(new Server("2.2.2.2")));
worker.executeCommand();
运行结果:
类图:
三、源码实例
(1)Thread里面的Runnable对象就是一个抽象的命令,都是需要重写其run方法。
(2)日常编码规范中方法参数设置一般都是传接口
最后说一句:设计模式基本是面向对象的多态、封装、继承的表现。