说我叫一个方法。我想从该方法返回值。但是,此方法将任务委托给其他方法,而这些方法仍然可以将任务委托给其他方法。最顶层方法最终返回的值最终由子方法和子方法的子方法确定。
想象一下这种情况:
public String method1(Object o){
if(x)
return subMethod1(o);
if(y)
return subMethod2(o);
if(z)
return subMethod3(o);
else
return "";
}
// example submethod
public String subMethod1(Object o){
if(a)
return subSubMethod1(o);
if(b)
return subSubMethod2(o);
if(c)
return subSubMethod3(o);
else
return "";
}
// example subsubmethod
public String subSubMethod1(Object o){
//etc etc
return "";
}
对我来说这是一个反复出现的问题,我希望有一种设计模式来解决这类问题。
有这样的设计模式吗?
答案 0 :(得分:3)
如果确实想要采用设计模式,责任链是我能为您的情况考虑的最接近的模式。但这可能会很快过火
public interface Handler{
void setNext(Handler h);
String handle(Object o);
}
public class Method1Handler implements Handler{
private Handler next;
@Override
public void setNext(Handler h){
this.next= h;
}
@Override
public String handle(Object o){
if(x){
return subMethod1();
}else if(next !=null){
return next.handle(o);
}
return "";
}
}
当然subMethod1()
也会使用CoR等。它可能会变得非常难看,但最高级别是干净的:
//top level of code
Method1Handler handler = new Method1Handler();
//...lots of set next
//...and set next of nexts etc
//...
return myHandler.handle(o);
答案 1 :(得分:2)
条件运算符使每组选择变得简单 - 如果你正确地将它放在一边,一旦你掌握了模式,就很容易阅读:
return x ? subMethod1(o)
: y ? subMethod2(o)
: z ? subMethod3(o)
: "";
当然,如果您的决定实际可以按多态行布局(即条件映射到对象在执行时的类型),那么您可以使用继承来解决此问题。但是如果你确实需要这样的多个条件,那么条件运算符会非常有用。