JUnit中的设计模式:命令(Command)模式
命令(Command)模式
命令模式的另一篇博文(《Head First设计模式》 读书笔记07 封装调用:命令模式)。
命令模式的意图
将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化;
对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式告诉我们可以为一个操作生成一个对象并给出它的一个执行方法。
命令模式的构成
1.客户角色:
创建一个具体命令对象,并确定其接受者。
2.命令角色:
声明一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个接口或抽象类实现。
3.具体命令角色:
定义一个接收者和行为之间的弱耦合,实现execute方法,负责调用接收者的相应操作。
4.请求者角色:
负责调用命令对象执行请求。
5.接收者角色:
负责具体实施和执行一个请求。
代码实例
一个简单的代码例子,实现命令模式中的各个角色:
package com.meng.designpattern.command; //接收者 public class Receiver { public void doAction() { System.out.println("doAction in Receiver"); } }
package com.meng.designpattern.command; //抽象的命令角色 public interface Command { public void execute(); }
package com.meng.designpattern.command; //具体的命令角色,关联到一个接收者 public class ConcreteCommand implements Command { private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } @Override public void execute() { // 负责调用接收者的相应操作 receiver.doAction(); } }
package com.meng.designpattern.command; //命令调用者,请求者 public class Invoker { private Command command; public Invoker(Command command) { this.command = command; } public void doInvokerAction() { // 负责调用命令对象执行请求 command.execute(); } }
package com.meng.designpattern.command; public class Client { public static void main(String[] args) { // 接收者 Receiver receiver = new Receiver(); // 命令:具体命令关联接收者 Command command = new ConcreteCommand(receiver); // 调用者 Invoker invoker = new Invoker(command); // 调用者调用命令,实际是所关联的接收者执行操作 invoker.doInvokerAction(); } }
在JUnit中的体现
我们编写的TestCase就像是一个命令,通过调用器调用后,JUnit框架中有相应的接收者来执行我们的测试方法。
使用命令(Command)模式后给系统的架构带来了哪些效果
Command模式将实现请求的一方(TestCase)和调用一方(JUnit)进行解耦。
Command模式使得新的TestCase很容易加入,无需改变已有的类,只需继承TestCase类即可,这样方便了测试人员。
Command模式可以将多个TestCase进行组合成一个复合命令,TestSuite就是复合命令,它使用了Composite模式。
Command模式容易把请求的TestCase组合成请求队列,这样使接收请求的一方(JUnit Framework)容易决定是否执行请求,一旦发现测试用例失败或者错误可以立刻停止,进行报告。
参考资料
圣思园张龙老师视频教程。