2010年9月21日 星期二

Design Pattern hw1b – part 2

又繼續查,發現原來真的有不用instanceof就可以知道現在傳進來的instance是哪種class的方法,就是
instance.getClass().getName()。不同杯子種類的B式喝法很直接的就把他想成一個抽象的喝法家族。所以現在就需要一個class name和喝法的mapping。果然java跟STL一樣有提供現成的map

接下來的難題就是原本的testbench是把typeBdrink寫成static,然後static函式不能call non-static函式…所以我就把一堆東西改成static…

// abstract class DrinkMethod{} … 不同喝法的東西寫在前面
public class TypeBdrink{
    static Map  <String, DrinkMethod> map;
    static boolean HasInit = false; 

    public static void MapInit(){
        // 不知道為什麼以下看起來是non-static的部份可以執行 ?_?
        map = new HashMap<String, DrinkMethod>();
        map.put("Cup",  new TypeBCup() );
        map.put("Mug", new TypeBMug() );
        map.put("PaperCup", new TypeBPaperCup() );
    } 

    public static void typeBdrink(Cup c, int n){
        if (HasInit == false) {
            MapInit();
            HasInit = true;
        }
        String CupType = c.getClass().getName();
        DrinkMethod drinkmethod = map.get(CupType); 

        drinkmethod.drink(c, n);
    }
}

以後要增加杯子種類就加在MapInit(),加新的喝法就去繼承DrinkMethod然後重寫喝法內容,看起來還蠻符合要求的。至於為什麼這樣寫可以避開static不能呼叫non-static就不知道了 ?_?,而且這個寫法直接用提供的JUnit testbench會丟InvocationTargetException,但是我自己寫一個main的話是可以執行結果也正常,就當作寫完了吧 XD。

沒有留言: