JUNIT源碼探秘(四):Junit代碼分析之命令模式
Junit在執(zhí)行測試代碼時,使用了命令模式,那么什么是命令模式,拿幾個例子來說明下。
在《java與模式》書中,用一個很生動的例子來說明命令模式,“玉帝傳美猴王上天”。在這我們也用這個例子說明下;這個事情整個過程如下:
玉帝傳美猴王上天
整個過程有兩個很明顯的角色,玉帝和美猴王;仔細想想,這個玉帝不可能親自教美猴王去吧?那么派誰去呢?通過簡單分析,兩外一個角色出現(xiàn)了,傳遞命令者(設(shè)計模式中叫調(diào)用者)宮中的跟隨者或者太監(jiān)等人,那么玉帝派太白金星;光太白金星自己去還不行,必須拿著玉帝的信物,比如圣旨、或者其他。那么到底是什么東西呢?這個要看玉帝給他什么東西,他拿什么東西;在仔細想想,那么玉帝給的東西可能裝在一個盒子里或者信封里,具體什么東西都無所謂了,那么我們可以把這個盒子或者信封看做這個信物的接口,而盒子或者信物里的具體信物看做一個實現(xiàn)類。
通過這么一分析,那么我們可以看出整個命令模式中有五個對象:
傳遞信物的盒子或者信封
信封或者盒子中的具體信物
傳遞信息者太白金星
下達指令者玉皇大帝
執(zhí)行命令著美猴王
在命令模式中剛好也有五個角色如下:
客戶(Client)角色:創(chuàng)建一個具體的命令(ConcreteCommand)對象,并確定其接受者。這個角色當(dāng)然是玉皇大帝了。
命令(Command)角色:聲明給所有具體命令類的抽象接口,這是一個抽象角色,通常通過java的接口實現(xiàn);這個對應(yīng)到這個實例中可以看做是傳遞信物的盒子或者信封等
具體命令(ConcreteCommand)角色:定義一個接收者和行為之間的弱耦合,實現(xiàn)execute()方法,負(fù)責(zé)調(diào)用接受者的相應(yīng)操作,execute()方法通常叫執(zhí)行方法,對應(yīng)到實例可以看做是盒子里的具體信物,比如圣旨、或者其他具有玉皇大帝省份標(biāo)示的東西
請求者(Invoker)角色:負(fù)責(zé)調(diào)用命令對象執(zhí)行請求,相關(guān)的測試方法叫做行動方法。在這個實例中太白金星扮演這個角色。
接受者(Receiver)角色:負(fù)責(zé)具體實施和請求一個請求。任何一個類都可以成為接受者,實施和執(zhí)行請求的方法叫做行動方法。這個實例中這個角色自然是美猴王了。
具體代碼實現(xiàn),先從接受者開始
接受者(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();
}
}