java - 重构 if 语句以使用适当的模式

标签 java oop design-patterns

我有一个枚举,里面有一些状态:

enum State
{
    A,
    B,
    C,
    D
}

以及具有相应状态的对象:

class MyObject
{
    State state;
}

我需要编写一个算法,它接受两个 MyObject 实例并根据这些实例的特定状态执行某些操作:

void doWork(MyObject o1, MyObject o2)
{
     if (o1.state == A && o2.state == A)
     {
          // do something
     }
     else if (o1.state == A && o2.state == B)
     {}
     // etc for all combinations...

}

显然这种方法有很多问题,我想改变它以理想地摆脱 if/else 语句。

这样的要求有什么模式吗?

谢谢

最佳答案

可以做的,虽然我不确定它会好得多,是两个 state 值的所有可能组合的某种矩阵;然后,您可以使用 o1.stateo2.state 作为该矩阵的索引。

你可以在那个矩阵中存储不同的东西:

  • 一个独特的值,您可以将其用作 switch block 的区分值,它将替换您的 if .. else if .. else block ——不是很多真的是进步。

或者您的矩阵可能包含...

如果您真的想摆脱 if 语句,第二个选项可能更好;但是请注意,您的代码将不再像 if/switch block 那样在一个位置靠近在一起,而是分布在几个不同的位置命令对象/类。

// forgive my syntax errors etc., my Java has definitely gone a little rusty!

interface WorkCommand {
    public abstract void run(MyObject o1, MyObject o2);
}

...

Map<Pair<State,State>, WorkCommand> commands;
// ^ pseudo-code type for your command look-up map; type Pair<X,Y> doesn't exist,
//   so replace this with something sensible!

void doWork(MyObject o1, MyObject o2)
{
    WorkCommand worker = commands.get(new Pair<State,State>(o1, o2));
    worker.run(o1, o2);
}

关于java - 重构 if 语句以使用适当的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4168285/

相关文章:

java - 如何修改另一个类的方法

c# - 集合类型属性的 setter

php - PDO 自定义类和安全性

c++ - 为什么这个对象没有检测到父类?

javascript - 仅将应用程序脚本公开给某些脚本

java - JPA 对嵌套实体的唯一约束

java - 为什么 Java 8 提供方法引用?

java - 在一个循环中打印字符串和整数

design-patterns - [GoF]-ConcreteSubject 可以覆盖通知方法吗?

Java - 这是一个成语还是模式,没有状态的行为类