首页 > 代码库 > 命令模式

命令模式

命令模式的定义

命令模式是一个高内聚的模式,其定义为:Encapsulate a request as an object,thereby

letting you parameterize clients with different requests,queue or log requests,and support undoable

operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请

求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)

 

● Receive接收者角色

 

该角色就是干活的角色,命令传递到这里是应该被执行的

 

● Command命令角色

 

需要执行的所有命令都在这里声明。

 

● Invoker调用者角色

 

接收到命令,并执行命令。

 

命令模式比较简单,但是在项目中非常频繁地使用,因为它的封装性非常好,把请求方

 

Invoker)和执行方(Receiver)分开了,扩展性也有很好的保障,通用代码比较简单。

 

通用Receiver类

 

public abstract class Receiver {

 

     //抽象接收者,定义每个接收者都必须完成的业务

 

     public abstract void doSomething();

 

}

 

为什么Receiver是一个抽象类?那是因为接收者可以有多个,有多个就需要定

 

义一个所有特性的抽象集合——抽象的接收者

 具体的Receiver类

public class ConcreteReciver1 extends Receiver{    

     //每个接收者都必须处理一定的业务逻辑

     public void doSomething(){

     }

}

public class ConcreteReciver2 extends Receiver{

     //每个接收者都必须处理一定的业务逻辑

     public void doSomething(){

     }

}

接收者可以是N个,这要依赖业务的具体定义。命令角色是命令模式的核心

 

抽象的Command类

 

public abstract class Command {

 

     //每个命令类都必须有一个执行命令的方法

 

HuDun Demo

 

     public abstract void execute();

 

}

具体的Command类

public class ConcreteCommand1 extends Command {

     //对哪个Receiver类进行命令处理

     private Receiver receiver;

     //构造函数传递接收者

     public ConcreteCommand1(Receiver _receiver){

             this.receiver = _receiver;

     }

     //必须实现一个命令

     public void execute() {

             //业务处理

             this.receiver.doSomething();

     }

}

public class ConcreteCommand2 extends Command {

     //哪个Receiver类进行命令处理

     private Receiver receiver;

     //构造函数传递接收者

     public ConcreteCommand2(Receiver _receiver){

             this.receiver = _receiver;

     }

     //必须实现一个命令

     public void execute() {

             //业务处理

             this.receiver.doSomething();

     }

}

定义了两个具体的命令类,读者可以在实际应用中扩展该命令类。在每个命令类中,通

过构造函数定义了该命令是针对哪一个接收者发出的,定义一个命令接收的主体。调用者非

常简单,仅实现命令的传递

 

调用者Invoker类

 

public class Invoker {

 

     private Command command;

 

     //受气包,接受命令

 

     public void setCommand(Command _command){

 

             this.command = _command;

 

     }

 

     //执行命令

 

     public void action(){

 

             this.command.execute();

 

     }

 

}

 

调用者就像是一个受气包,不管什么命令,都要接收、执行!

 

场景类

 

public class Client {

 

     public static void main(String[] args) {

 

             //首先声明调用者Invoker

 

             Invoker invoker = new Invoker();

 

             //定义接收者

 

             Receiver receiver = new ConcreteReciver1();

 

             //定义一个发送给接收者的命令

 

             Command command = new ConcreteCommand1(receiver);

 

             //把命令交给调用者去执行

 

             invoker.setCommand(command);

 

             invoker.action();

 

     }

 

}

命令模式的优点

● 类间解耦

调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command

抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。

● 可扩展性

Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严

重的代码耦合。

● 命令模式结合其他模式会更优秀

命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少

Command子类的膨胀问题。

 命令模式的缺点

命令模式也是有缺点的,请看Command的子类:如果有N个命令,问题就出来

了,Command的子类就可不是几个,而是N个,这个类膨胀得非常大

 

命令模式的使用场景

 

只要你认为是命令的地方就可以采用命令模式

 

命令模式