命令模式

1.定义

命令模式(英语:Command pattern)是一种设计模式,它尝试以对象来代表实际行动。命令对象可以把行动(action) 及其参数封装起来,于是这些行动可以被:重复多次/取消(如果该对象有实现的话)/取消后又再重做

维基百科-命令模式

2.实现

命令(Command)模式

  • 客户(Client)角色
  • 命令(Command)角色
  • 具体命令(Concrete Command)角色
  • 接收者(Receiver)角色

命令模式

  1. 命令(Command)角色
/**
 * 命令(Command)角色
 */
public interface Command {

    void execute();
}
  1. 接收者(Receiver)角色
/**
 * 接收者(Receiver)角色
 */
public class Receiver {

    public void on() {
        System.out.println("Receiver is on");
    }

    public void down() {
        System.out.println("Receiver is down");
    }
}
  1. 具体命令(Concrete Command)角色
/**
 * 具体命令(Concrete Command)角色
 */
public class ConcreteCommandOn implements Command{

    private Receiver receiver;

    public ConcreteCommandOn(Receiver receiver) {
        this.receiver = receiver;
    }

    public void execute() {
        receiver.on();
    }
}

/**
 * 具体命令(Concrete Command)角色
 */
public class ConcreteCommandDown implements Command{

    private Receiver receiver;

    public ConcreteCommandDown(Receiver receiver) {
        this.receiver = receiver;
    }

    public void execute() {
        receiver.down();
    }
}
  1. 客户(Client)角色
public class CommandClient {

    public static void main(String[] args) {
        Receiver receiver = new Receiver();

        Command commandOn = new ConcreteCommandOn(receiver);
        commandOn.execute();

        Command commandDown = new ConcreteCommandDown(receiver);
        commandDown.execute();

        // stdout
        // Receiver is on
        // Receiver is down
    }
}

4.总结

优缺点

  • 更松散的耦合
  • 共动态的控制
  • 能很自然的复合命令
  • 更好的扩展性

何时选用

  • 如果需要抽象出需要执行的动作,并参数化这些对象,可以选用命令模式,把这些需要执行的动作抽象成为命令,然后实现命令的参数化配置
  • 如果需要在不同的时刻指定、排列和执行请求,可以选用命令模式,把这些请求封装成为命令对象,然后实现把请求队列化。
  • 如果需要支持取消操作,可以选用命令模式,通过管理命令对象,能很容易的实现命令的恢复和重做的功能
  • 如果需要支持当系统崩溃时,能把对系统的操作功能重新执行一遍,可以选用命令模式,把这些操作功能的请求封装成命令对象,然后实现日志命令,就可以在系统恢复回来后,通过日志获取命令列表,从而重新执行一遍功能
  • 在需要事物的系统中,可以选用命令模式,命令模式提供了对事务进行建模的方法,命令模式有一个别名就是Transaction

results matching ""

    No results matching ""