命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
所涉及的角色:
1.客户(Client)角色:
创建一个具体对象及其确定接收者.
2.命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
3.具体命令(ConcreteCommand)角色:定义一个接收者与行为之间的弱耦合,实现exceute()方法,负责调用接收者的相应操作
4.请求者(Invoker)角色:
负责调用命令对象执行请求。
5.接收者(Recevice)角色:负责具体实施与执行一个请求。
commmand.bmp
优点:
解耦了发送者和接受者之间联系。 发送者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,发送者无需知道接受者任何接口。
命令模式创建的一般步骤
1.客户端创建一个ConcreteCommand对象,并指明接收者。
2.请求对象保持ConcreteCommand对象。
3.请求对象通过调用action方法发出请求,若命令是可撤消,则ConcreteCommand保存execute()方法执行前的状态。
4.ConcreteCommand对象调用接收的方法执行请求。

一个简单例子:
抽象命令接口:
package command;
public interface Command{
    
//执行方法
     void execute();
}
具体命令
package command;
public class ConcreteCommand implements Command{
    
//接收者
    private Receiver receiver;
    
//构造方法
    public ConcreteCommand(Receiver receiver){
        
this.receiver=receiver;
    }

    
//执行方法
    public void execute(){
        receiver.action();
    }

}
接收者:
package command;
public  class Receiver {
    
//构造方法
    public Receiver(){};
    
//行为方法
    public void action(){
        System.out.println(
"Action is taken here");
    }

}
请求者:
package command;
public class Invoker{
    
//命令
    private Command command;
    
//构造方法
    public Invoker(Command command){
        
this.command=command;
    }

    
//行为方法
    public void action(){
        command.execute();
    }

}
客户端:
package command;
public class Client{
    
public static void main(String[] args){
        Receiver receiver
=new Receiver();
        Command concreteCommand
=new ConcreteCommand(receiver);
        Invoker invoker
=new Invoker(concreteCommand);
        invoker.action();
    }

}
命令模式与责任链模式区别:
责任链模式使一个特定的请求接收对象对请求与命令的执行变得不确定性.而命令模式使得一个特定的对象对命令的执行变得明显与确定.

参考资料:《Java与模式》
http://www.jdon.com/designpatterns/command.htm