我正在学习设计模式,我感到困惑,因为我不知道哪种模式最适合这种情况:
我有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语句的最佳模式是什么?你有什么看法?
答案 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
显示的内容可能会被视为类型系统。从本质上讲,这里的相关模式可能是一个简单的“转换”,“战略模式”或“访客”。
应选择何种模式/实施在很大程度上取决于范围和范围。行动和类型的可变性。
需要考虑的一些问题:
现在来看模式。
MyProcess.doAction()
以适当选择实现。StringType.doAction()
以适当选择实现。StringType
的实例以适当地实现doAction()
方法。说实话,给出的问题和例子很差。缺乏意义,有意义的设计答案 - 但以下应该给你一些思考的食物。
我绝对建议您尝试用这些东西制作一个有意义的域名模型(IBAN代码,如果它们是什么)。你需要考虑你的具体类型和行动是,以及这些行动的相对动态性/固定性,以获得适当的设计。