首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这种设计模式是如何命名的?(映射而不是开关)

这种设计模式是如何命名的?(映射而不是开关)
EN

Stack Overflow用户
提问于 2014-02-21 22:08:05
回答 2查看 3K关注 0票数 0

所以我们有货物,货物有价格。我想计算一下货物的价格。

第一版(开关):

代码语言:javascript
复制
int getPrice(String name){
   switch(name){
      case "Apple": return 20;
      case "Banana": return 100;
      ... 
   }
}

第二版(地图):

代码语言:javascript
复制
Map<String, Integer> prices = new HashMap<String, Integer>;    

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-21 22:37:24

我想说这是查表的一个特例。我不认为它是一种设计模式,因为它们更大、更抽象。这是一个实现细节。

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

代码语言:javascript
复制
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();
    }
}

与查找相反:

代码语言:javascript
复制
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();
}

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

票数 3
EN

Stack Overflow用户

发布于 2014-02-21 22:09:51

您所描述的不是一个设计模式。这只是实现相同目标的另一种方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21946188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档