设计模式[18]-命令模式-Comand Pattern

1.命令模式简介

命令模式(Command Pattern)模式是是行为型(Behavioral)设计模式,将一个请求(命令)封装成一个对象,从而可以用不同的请求对客户进行参数化,实现请求的发送者和接收者解耦;还可以对请求排队或者记录请求日志,以及支持撤销操作。

命令模式一共有四种角色:

(1) Command(抽象命令类):它定义命令的接口,声明执行的方法execute()

(2) ConcreteCommand(具体命令类):是抽象命令类的子类,持有接受者对象,并在执行方法execute()中调用接受者的相关动作。

(3) Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。

(4) Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。

Invoker(调用者)和 Receiver(接收者)之间通过命令(Command)解耦。

2. 命令模式举例

下面做一个连长命令士兵开火的例子,连长(Captain)下达了开火命令,士兵(Soldier)接收到开火命令,并执行。

序号 类名 角色 说明
1 Command Command 抽象命令类
2 FireCommand ConcreteCommand 具体命令类,开火命令
3 Captain Invoker 调用者,上尉连长
4 Soldier Receiver 接收者,士兵
5 CommandMain 客户端 演示调用
设计模式[18]-命令模式-Comand Pattern_第1张图片
Command Pattern

1. 抽象命令类

/**
 * 抽象命令类
 */
public interface Command {

    void execute();
}

**2. 调用者,上尉连长 **

/**
 * 上尉,调用者,是发送命令的一方。
 */
public class Captain {

    private Command command;

    // 构造器方式
    public Captain(Command command) {
        this.command = command;
    }

    // 设值方式
    public void setCommand(Command command) {
        this.command = command;
    }

    // 下命令的业务方法,调用命令类的execute()方法
    public void invoke() {
        System.out.println("上尉类:下达开火命令");
        command.execute();
    }
}

3. 士兵类,接受命令的一方

/**
 * 士兵类,执行者,接受命令的一方。
 */
public class Soldier {

    public void fire() {
        System.out.println("士兵类:执行命令,开始射击");
    }

}

4. 具体命令类,开火命令

/**
 * 开火命令,具体命令类
 */
public class FireCommand implements Command {

    // 命令接收者。
    private Soldier soldier;

    public FireCommand(Soldier soldier) {
        this.soldier = soldier;
    }

    @Override
    public void execute() {
        // 调用命令接受者的业务方法。
        soldier.fire();
    }
}

5. 演示类

public class CommandMain {
    public static void main(String[] args) {
        Soldier soldier = new Soldier();
        Command command = new FireCommand(soldier);
        Captain captain = new Captain(command);
        captain.invoke();
    }
}

结果输出

上尉类:下达开火命令
士兵类:执行命令,开始射击

3. 总结

命令模式通过命令降低了请求方和接受者这两个对象之间的耦合度;具备良好的扩展性,可以很方便的引入新的命令;也可以把若干命令组装成成一个组合命令。当然,使用命令模式,可能会使得系统中存在着大量的命令类。

(完)

你可能感兴趣的:(设计模式[18]-命令模式-Comand Pattern)