Java:使用多态性来避免if语句?

我正在尝试编写一个java程序,该程序根据用户选择的内容初始化某些布局。我想做的是尽量避免编写一堆if语句,这样在需要添加更多布局时,代码可以扩展以供将来使用。我听说实现这一点的最佳方法是使用多态性,但我对多态性的理解仍然有点模糊。

假设我想实现这个案例:

if (user choose layoutA) { initialize layoutA }
if (user choose layoutB) { initialize layoutB }
if (user choose layoutC) {initialize layoutC }

我正在考虑为要实现的类创建一个接口。让我感到困惑的是它在main()中的工作方式,难道我还需要一个有条件的if或switch语句来弄清楚要实例化的类吗?

interface LayoutHandler {
    public void initializeLayout();
}

class layoutA implements LayoutHandler { 
    public void initialize Layout {initialize layout A}
}
class layoutB implements LayoutHandler { 
    public void initialize Layout {initialize layout B}
}
class layoutC implements LayoutHandler { 
    public void initialize Layout {initialize layout C}
}

然后在主要位置的某个地方:

public static void main() {
   getlayoutselectionfromuser()
   if (user choose layoutA) { LayoutHandler layout = new layoutA(); }
   if (user choose layoutB) { LayoutHandler layout = new layoutB(); }
   if (user choose layoutC) { LayoutHandler layout = new layoutC(); }

}

难道我不需要在主程序中使用开关或if语句来找出用户在运行时选择了哪种布局吗?

谢谢!


答案 1

通常,很难避免在某些时候使用某种条件语句来创建相应类的实例。

多态性的好处来自于您在多个位置有多个 if-else 语句。多态性为您封装了条件逻辑。有关主题的其他一些讨论,请参阅此问题。

这种分散的逻辑:

void initLayout() {
   if (user choose layoutA) { initialize layoutA }
   if (user choose layoutB) { initialize layoutB }
   if (user choose layoutC) {initialize layoutC }
}

void refreshLayout() {
   if (user choose layoutA) { refresh layoutA }
   if (user choose layoutB) { refresh layoutB }
   if (user choose layoutC) { refresh layoutC }
}

void cleanupLayout() {
   if (user choose layoutA) { cleanup layoutA }
   if (user choose layoutB) { cleanup layoutB }
   if (user choose layoutC) { cleanup layoutC }
}

替换为更简单的内容:

   layout = getLayout(user choice);

   layout.initLayout();
   layout.refreshLayout();
   layout.cleanupLayout();

答案 2

由于java没有一等函数,因此您可以使用接口进行换行。

LayoutHandler ~> Interface

LayoutHandlerA, LayoutHandlerB, etc implements LayoutHandler

Map<String, LayoutHandler> handlers = new HashMap<...>();

LayoutHandler handler = handlers.get(userSelectedLayout);

handler.handle();

推荐