JUNIT源码探秘(四):Junit代码分析之命令模式
Junit在执行测试代码时,使用了命令模式,那么什么是命令模式,拿几个例子来说明下。
在《java与模式》书中,用一个很生动的例子来说明命令模式,“玉帝传美猴王上天”。在这我们也用这个例子说明下;这个事情整个过程如下:
玉帝传美猴王上天
整个过程有两个很明显的角色,玉帝和美猴王;仔细想想,这个玉帝不可能亲自教美猴王去吧?那么派谁去呢?通过简单分析,两外一个角色出现了,传递命令者(设计模式中叫调用者)宫中的跟随者或者太监等人,那么玉帝派太白金星;光太白金星自己去还不行,必须拿着玉帝的信物,比如圣旨、或者其他。那么到底是什么东西呢?这个要看玉帝给他什么东西,他拿什么东西;在仔细想想,那么玉帝给的东西可能装在一个盒子里或者信封里,具体什么东西都无所谓了,那么我们可以把这个盒子或者信封看做这个信物的接口,而盒子或者信物里的具体信物看做一个实现类。
通过这么一分析,那么我们可以看出整个命令模式中有五个对象:
传递信物的盒子或者信封
信封或者盒子中的具体信物
传递信息者太白金星
下达指令者玉皇大帝
执行命令着美猴王
在命令模式中刚好也有五个角色如下:
客户(Client)角色:创建一个具体的命令(ConcreteCommand)对象,并确定其接受者。这个角色当然是玉皇大帝了。
命令(Command)角色:声明给所有具体命令类的抽象接口,这是一个抽象角色,通常通过java的接口实现;这个对应到这个实例中可以看做是传递信物的盒子或者信封等
具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合,实现execute()方法,负责调用接受者的相应操作,execute()方法通常叫执行方法,对应到实例可以看做是盒子里的具体信物,比如圣旨、或者其他具有玉皇大帝省份标示的东西
请求者(Invoker)角色:负责调用命令对象执行请求,相关的测试方法叫做行动方法。在这个实例中太白金星扮演这个角色。
接受者(Receiver)角色:负责具体实施和请求一个请求。任何一个类都可以成为接受者,实施和执行请求的方法叫做行动方法。这个实例中这个角色自然是美猴王了。
具体代码实现,先从接受者开始
接受者(Receiver)
public class Receiver {
public void doAction(){
System.out.println("上天");
}
}
命令(Command)
public interface Command {
public void execute();
}
具体命令(ConcreteCommand)
public class ConcreteCommand implements Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.doAction();
}
}
请求者(Invoker)
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void doInvokerAction() {
command.execute();
}
}
客户(Client)
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();
}
}