我有一个枚举,里面有一些状态:
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.state
和 o2.state
作为该矩阵的索引。
你可以在那个矩阵中存储不同的东西:
- 一个独特的值,您可以将其用作
switch
block 的区分值,它将替换您的if .. else if .. else
block ——不是很多真的是进步。
或者您的矩阵可能包含...
- 命令对象。 (查找 Command Pattern 。)
如果您真的想摆脱 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/