【设计模式-命令模式】

2020-09-01 16:26:59 浏览数 (1)

【导读】这是一个抽象与具体的关系,比如军队中上级命令下级去模拟训练或处理突发情况,这些都属于命令,只是命令的具体内容不同。

一、定义

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

二、实例

比如日常打杂中,组长需要让打杂人员(例如我)去启动或关闭某个服务器,这就是一组命令,组长与打杂人员之间的介质是命令这个对象。

服务器对象:

代码语言: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)日常编码规范中方法参数设置一般都是传接口

最后说一句:设计模式基本是面向对象的多态、封装、继承的表现。

0 人点赞