java_设计模式_命令模式_Command Pattern(2016-08-09)

时间:2023-03-08 18:58:01

理解还不到位,先窜出来。等过一阵子再看,再理解。

定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

类型:行为类模式

类图:

java_设计模式_命令模式_Command Pattern(2016-08-09)

命令模式的结构

顾名思义,命令模式就是对命令的封装,首先来看一下命令模式类图中的基本结构:

  • 命令(Command)角色是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。
  • 具体命令(ConcreteCommand)角色Command类的实现类,对抽象类中声明的方法进行实现;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
  • 客户端(Client)角色最终的客户端调用类;创建一个具体命令(ConcreteCommand)对象并确定其接收者。

以上三个类的作用应该是比较好理解的,下面我们重点说一下Invoker类和Recevier类。

  • 调用者(Invoker)角色调用者,负责调用命令。
  • 接收者(Receiver)角色接收者,负责接收命令并且执行命令。

命令模式作为一种行为类模式,首先要做到低耦合,耦合度低了才能提高灵活性,而加入调用者和接收者两个角色的目的也正是为此。

命令模式的通用代码如下:

class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void action(){
this.command.execute();
}
} abstract class Command {
public abstract void execute();
} class ConcreteCommand extends Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
public void execute() {
this.receiver.doSomething();
}
} class Receiver {
public void doSomething(){
System.out.println("接受者-业务逻辑处理");
}
} public class Client {
public static void main(String[] args){
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
//客户端直接执行具体命令方式(此方式与类图相符)
command.execute(); //客户端通过调用者来执行命令
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.action();
}

调用时,执行的时序首先是调用者类,然后是命令类,最后是接收者类。

也就是说一条命令的执行被分成了三步,它的耦合度要比把所有的操作都封装到一个类中要低的多,而这也正是命令模式的精髓所在:把命令的调用者与执行者分开,使双方不必关心对方是如何操作的。

宏命令

  所谓宏命令简单点说就是包含多个命令的命令,是一个命令的组合。

  设想茱丽的录音机有一个记录功能,可以把一个一个的命令记录下来,再在任何需要的时候重新把这些记录下来的命令一次性执行,这就是所谓的宏命令集功能。因此,茱丽的录音机系统现在有四个键,分别为播音、倒带、停止和宏命令功能。此时系统的设计与前面的设计相比有所增强,主要体现在Julia类现在有了一个新方法,用以操作宏命令键。

aaarticlea/png;base64,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" alt="" />

系统需要一个代表宏命令的接口,以定义出具体宏命令所需要的接口。

public interface MacroCommand extends Command {
/**
* 宏命令聚集的管理方法
* 可以添加一个成员命令
*/
public void add(Command cmd);
/**
* 宏命令聚集的管理方法
* 可以删除一个成员命令
*/
public void remove(Command cmd);
}

具体的宏命令MacroAudioCommand类负责把个别的命令合成宏命令。

public class MacroAudioCommand implements MacroCommand {

    private List<Command> commandList = new ArrayList<Command>();
/**
* 宏命令聚集管理方法
*/
@Override
public void add(Command cmd) {
commandList.add(cmd);
}
/**
* 宏命令聚集管理方法
*/
@Override
public void remove(Command cmd) {
commandList.remove(cmd);
}
/**
* 执行方法
*/
@Override
public void execute() {
for(Command cmd : commandList){
cmd.execute();
}
} }

客户端类Julia

public class Julia {

    public static void main(String[]args){
//创建接收者对象
AudioPlayer audioPlayer = new AudioPlayer();
//创建命令对象
Command playCommand = new PlayCommand(audioPlayer);
Command rewindCommand = new RewindCommand(audioPlayer);
Command stopCommand = new StopCommand(audioPlayer); MacroCommand marco = new MacroAudioCommand(); marco.add(playCommand);
marco.add(rewindCommand);
marco.add(stopCommand);
marco.execute();
}
}

运行结果如下:

aaarticlea/png;base64,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" alt="" />

命令模式的优缺点

首先,命令模式的封装性很好:每个命令都被封装起来,对于客户端来说,需要什么功能就去调用相应的命令,而无需知道命令具体是怎么执行的。比如有一组文件操作的命令:新建文件、复制文件、删除文件。如果把这三个操作都封装成一个命令类,客户端只需要知道有这三个命令类即可,至于命令类中封装好的逻辑,客户端则无需知道。

其次,命令模式的扩展性很好,在命令模式中,在接收者类中一般会对操作进行最基本的封装,命令类则通过对这些基本的操作进行二次封装,当增加新命令的时候,对命令类的编写一般不是从零开始的,有大量的接收者类可供调用,也有大量的命令类可供调用,代码的复用性很好。比如,文件的操作中,我们需要增加一个剪切文件的命令,则只需要把复制文件和删除文件这两个命令组合一下就行了,非常方便。

最后说一下命令模式的缺点,那就是命令如果很多,开发起来就要头疼了。特别是很多简单的命令,实现起来就几行代码的事,而使用命令模式的话,不用管命令多简单,都需要写一个命令类来封装。

命令模式的适用场景

对于大多数请求-响应模式的功能,比较适合使用命令模式,正如命令模式定义说的那样,命令模式对实现记录日志、撤销操作等功能比较方便。

 总结

对于一个场合到底用不用模式,这对所有的开发人员来说都是一个很纠结的问题。有时候,因为预见到需求上会发生的某些变化,为了系统的灵活性和可扩展性而使用了某种设计模式,但这个预见的需求偏偏没有,相反,没预见到的需求倒是来了不少,导致在修改代码的时候,使用的设计模式反而起了相反的作用,以至于整个项目组怨声载道。这样的例子,我相信每个程序设计者都遇到过。所以,基于敏捷开发的原则,我们在设计程序的时候,如果按照目前的需求,不使用某种模式也能很好地解决,那么我们就不要引入它,因为要引入一种设计模式并不困难,我们大可以在真正需要用到的时候再对系统进行一下,引入这个设计模式。

拿命令模式来说吧,我们开发中,请求-响应模式的功能非常常见,一般来说,我们会把对请求的响应操作封装到一个方法中,这个封装的方法可以称之为命令,但不是命令模式。到底要不要把这种设计上升到模式的高度就要另行考虑了,因为,如果使用命令模式,就要引入调用者、接收者两个角色,原本放在一处的逻辑分散到了三个类中,设计时,必须考虑这样的代价是否值得。

参考抄袭来自:

http://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html

http://blog.****.net/zhengzhb/article/details/7550895