N長時間沒來這了,沒想到連後台介面都換了。。。
廢話不說,進入正題!
系統架構:一棵"命令"樹,一棵"資料"樹,命令樹的根,即頂端元素是一個抽象類別或介面,對外提供一個 execute 方法,但是這個方法的傳回型別會因為命令的不同而不同,在這裡舉兩個個執行個體,以學生選課來說。
命令一、學生選的課的列表 GetMyCourseCommand 命令的 execute() 方法應返回一個 List。
命令二、是不是選了某一個課程 CourseIsSelectedCommand 命令的 execute() 方法返回一個 Boolean。
這樣的話,我的介面會定義成: public interface Comamnd<T>...{
public T execute();
}
由於我不想讓用戶端知道自己到底調用了哪一個命令,於是寫一個工廠來生產 Command,由於是工廠,所以 getCommand() 方法將被設定成 static 的,很簡單,我犯不著每次想得到一個 Command 都建立一個 Factory 對象。
這樣,用戶端要做的,就是根據需求建立不同的 Data 對象,並將 data 對象傳入Factory 方法,剛才提及的 getCommand() 的完整定義是 public static Command getCommand(Data d);
至此,用戶端在處理上述例子時對應應該做的就是:
例子一、 Data d = new GetMyCourseData(params...);
Command<List> cmd = CommandFactory.getCommand(d);
List<Course> list = cmd.execute();
例子二、 Data d = new CourseIsSelectedData(params...);
Command<Boolean> cmd = CommandFactory.getCommand(d);
boolean isSelected = cmd.execute();
用戶端好像挺清晰的,但是 Java 的泛型卻提示了警告,在中間那行生產Command對象的代碼那。
試過N多方法,除了 new 一個工廠對象出來,並將 getCommand 改為成員方法外,都無法消除這個警告。當然,我也不確定這個做法是不是有點設計過度