java - 这种设计模式怎么称呼呢? ( map 而不是开关)

标签 java design-patterns switch-statement

所以我们有商品,商品也有价格。 我想计算一下商品的价格。

第一个版本(切换):

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

第二版( map ):

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

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

那么这个方法(或设计模式)是如何调用的呢?有什么特别的名字吗?

最佳答案

我想说这是 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();
}

但这不是策略模式的一部分。

关于java - 这种设计模式怎么称呼呢? ( map 而不是开关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21946188/

相关文章:

java - 如何修复 Android 中提供的layout_width属性

java - 将实体类参数传递给 createNativeQuery 有何作用?

postgresql - 只用redis来实现activity stream有多安全?

c# - 哪种设计模式用于为类提供额外的属性?

java - 重构包含无参数方法的 switch 语句

java - 等距 map 绘制、生成

java - 登录 SMTPAppender : Where/how to specify to/from field when using JNDI

java - 分两个层次应用工厂模式

jquery - 如何使用 jquery 切换 li id ='' Sprite 背景

ruby-on-rails - 匹配时的情况