命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式结构图如下所示:
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();
}命令模式的优缺点:
首先命令模式的封装性很好:每个命令都被封装起来,对于客户端来说,需要什么功能就去调用相应的命令,而无需知道命令具体是怎么执行的。其次,命令模式的扩展性很好,在命令模式中,在接收者类中一般会对操作进行最基本的封装,命令类则通过对这些基本的操作进行二次封装,当增加新命令的时候,对命令类的编写一般不是从零开始的,有大量的接收者类可供调用,也有大量的命令类可供调用。如果命令很多,不管多么简单的命令都会用一个命令类来封装,开发困难。
