适合这种情况的设计模式是什么?

时间:2017-03-26 23:54:10

标签: java oop design-patterns

我正在学习设计模式,我感到困惑,因为我不知道哪种模式最适合这种情况:

我有String,这个String可能是各种各样的。它可能是“123abc”,“abc123”,“abcdfe”或“123456”,只有那些字符串的。

public void doSomething(String variousString) {
    StringType type = checkType(variousString);
    if(type==StringType.Mixed) doMixedAction();
    if(type==StringType.OnlyLetters) doOnlyLetterAction();
    if(type==StringType.OnlyDigits) doOnlyDigitsAction();
}

首先我想到了策略模式,但我认为这里不匹配。现在我认为责任链在这里非常匹配。

在这种情况下删除if语句的最佳模式是什么?你有什么看法?

2 个答案:

答案 0 :(得分:1)

不是经典的设计模式,但也可以使用简单的地图

public class Main {
    private final Map<StringType, Runnable> bindings = new HashMap<>();

    public Main() {
        bindings.put(StringType.Mixed, () -> doMixedAction());
        bindings.put(StringType.OnlyLetters, () -> doOnlyLetterAction());
        bindings.put(StringType.OnlyDigits, () -> doOnlyDigitsAction());
    }

    public void doSomething(String variousString) {
        bindings.getOrDefault(checkType(variousString), () -> {}).run();
    }
}

答案 1 :(得分:1)

您使用StringType显示的内容可能会被视为类型系统。从本质上讲,这里的相关模式可能是一个简单的“转换”,“战略模式”或“访客”。

应选择何种模式/实施在很大程度上取决于范围和范围。行动和类型的可变性。

需要考虑的一些问题:

  • 是数量和数量少的行动在整个应用程序中重用为基础结构,还是应用程序会创建许多任意操作?
  • 是固定的类型吗?
  • 对于Action实现能够彼此委托是否有用,例如。用简单的行为来构建复杂的行为?

现在来看模式。

在业务逻辑中,使用简单的开关

  • 使用开关实现MyProcess.doAction()以适当选择实现。
  • 适用于类型系统很多/或不知道的动作,但类型相当好。

在Type System中,使用简单的开关

  • 使用开关实现StringType.doAction()以适当选择实现。
  • 适用于&#34;类型&#34;谦虚&amp;提前知道类型系统。

类型系统中的策略模式

  • 子类型或参数化StringType的实例以适当地实现doAction()方法。
  • 适用于&#34;动作&#34;需要的是温和的提前知道类型系统。
  • 策略还可以允许责任链&#39 ;;当Strategies委托时,就会出现这种情况。

访客模式,从类型系统

发送
  • 定义一个StringVisitor(哦,我的,一个有意义的名字会让这更容易)。
  • 实现了visitMixed(),visitOnlyLetters(),visitOnlyDigits()方法。
  • 然后,StringValue或某个帮助程序可以根据类型将其发送到任意访问者。

说实话,给出的问题和例子很差。缺乏意义,有意义的设计答案 - 但以下应该给你一些思考的食物。

我绝对建议您尝试用这些东西制作一个有意义的域名模型(IBAN代码,如果它们是什么)。你需要考虑你的具体类型和行动是,以及这些行动的相对动态性/固定性,以获得适当的设计。