命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式结构图如下所示: command Command类,用来声明执行操作的接口:

abstract class Command{
    protected Receiver receiver;
    public Command(Receiver receiver){
        this.receiver=receiver;
    }
    abstract public void Execute();
}

ConcreteCommand类,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute:

class ConcreteCommand extends Command{
    public ConcreteCommand(Receiver receiver){
        super(receiver);
    }
    public void Execute(){
        receiver.Action();
    }
}

Invoker类,要求该命令执行这个请求:

class Invoker{
    private Command command;
    public void SetCommand(Command command){
        this.command=command;
    }
    public void ExecuteCommand(){
        command.Execute();
    }
}

Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者:

class Receiver{
    public void Action(){
        System.out.println("action");
    }
}

客户端代码:

static void main(String[] args){
    Receiver r=new Receiver();
    Command c=new ConcreteCommand(r);
    Invoker i=new Invoker();
    i.SetCommand(c);
    i.ExecuteCommand();
}

命令模式的优缺点:
首先命令模式的封装性很好:每个命令都被封装起来,对于客户端来说,需要什么功能就去调用相应的命令,而无需知道命令具体是怎么执行的。其次,命令模式的扩展性很好,在命令模式中,在接收者类中一般会对操作进行最基本的封装,命令类则通过对这些基本的操作进行二次封装,当增加新命令的时候,对命令类的编写一般不是从零开始的,有大量的接收者类可供调用,也有大量的命令类可供调用。如果命令很多,不管多么简单的命令都会用一个命令类来封装,开发困难。