2014-02-21 45 views
0

所以我們有貨物和物品有價格。 我想計算商品的價格。這種設計模式如何被稱爲? (地圖代替開關)

第一版(開關):

int getPrice(String name){ 
    switch(name){ 
     case "Apple": return 20; 
     case "Banana": return 100; 
     ... 
    } 
} 

第二個版本(圖):

Map<String, Integer> prices = new HashMap<String, Integer>;  

int getPrice(String name){ 
    return prices.get(name); 
} 

那麼怎樣用這種方法(或設計模式)被稱爲?有一個特殊的名字嗎?

+6

這看起來太簡單了,不能被視爲設計模式。你正在使用Map或者字典查找,這就是我所說的。 –

+0

還要注意,如果你的地圖不包含給定的鍵,你的第二個方法將會拋出一個'NullPointerException'。 –

+1

@ZouZou聽起來像是一種模式:) –

回答

2

我會說這是一個lookup table的特殊情況。我不會稱之爲設計模式,因爲它們更大更抽象。這是一個實現細節。

例如,這可以在策略模式中使用:

static KnotStrategy getKnotStrategy(String name) { 
    switch(name.toLowerCase()) { 
     case "slip": return new SlipKnot(); 
     case "granny": return new GrannyKnot(); 
     case "bowline" return new BowlineKnot(); 

     default: throw new IllegalArgumentException(); 
    } 
} 

而不是在查找:

static final Map<String, Supplier<KnotStrategy>> KNOTS = (
    new HashMap<String, Supplier<KnotStrategy>>() 
); 
static { 
    KNOTS.put("slip", SlipKnot::new); 
    KNOTS.put("granny", GrannyKnot::new); 
    KNOTS.put("bowline", BowlineKnot::new); 
} 

static KnotStrategy getKnotStrategy(String name) { 
    Supplier<KnotStrategy> supp = KNOTS.get(name); 
    if(supp != null) { 
     return supp.get(); 
    } 

    throw new IllegalArgumentException(); 
} 

但它不是戰略模式的一部分。

+0

謝謝,這是一個很好的例子。 這是什麼? SlipKnot :: new – user2693979

+0

它是漂亮的Java 8語法。它是對構造函數的lambda引用的簡寫。 'SlipKnot :: new'是'() - >新的SlipKnot()'的縮寫,這又是創建[Supplier]的簡寫形式(http://download.java.net/jdk8/docs/api/java/util /function/Supplier.html),它在'get'中返回'新的SlipKnot()'。有關預覽教程,請參見[方法參考](http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html)。 – Radiodef

0

你所描述的不是一種設計模式。這是實現相同目標的另一種方式。

+0

這並不是一種設計模式。 –

+0

它編譯後實際上是一樣的。 –

0

這不是一種設計模式。你在做什麼是使用數據結構而不是方法。在我看來,由於你想要做的只是地圖元素與價格,最好的辦法是做你的第二個版本。使用HashMap是解決您想要的操作的好方法。

相關問題