如何将此switch语句交换为多态方法?

时间:2018-05-12 08:47:00

标签: java switch-statement polymorphism

我一直在读Robert C. Martin的干净代码并研究可靠的原理,我在课堂上注意到了一些这样的代码:

@When("^they click the (.*) hyperlink$")
public void the_browser_opens_a_new_hyperlink(String link) {
    Runnable aSyncTask = null;
    switch (link.toLowerCase()) {
        case "cookie":
            aSyncTask =
                    () -> {
                        {
                            loginPage.openCookieInformationPage();
                            loginPage.switchToNewestTab();

                        }
                    };
            break;
        case "privacy policy":
            aSyncTask =
                    () -> {
                        {
                            loginPage.openPrivacyPolicyInformationPage();
                            loginPage.switchToNewestTab();
                        }
                    };
            break;
        case "report a problem":
            aSyncTask =
                    () -> {
                        {
                            loginPage.openReportAProblemPage();
                            loginPage.switchToNewestTab();
                        }
                    };
            break;
    }
    driverTabHelper.execAsyncTaskThatLaunchesATab(Objects.requireNonNull(aSyncTask, "invalid link specified"));
}

这显然违反了开放/封闭原则,因为我添加的链接越多,我将不得不继续修改此方法以解释它们。

正如您所看到的,loginPage目前提供了3个不同的链接作为此方法的字符串,但是稍后会有更多对象传入链接。

如何为多态性重写这个?我想可能有页面实现IOpenHyperlink并使用接口引用作为参数,但页面可以提供多个链接,每个链接添加一个接口?似乎过度了

此外,我们非常感谢任何关于改进代码的建议。

谢谢

1 个答案:

答案 0 :(得分:0)

这是您可以做的事情概念的证明。这段代码不会按原样编译。您可能希望根本不需要依赖注入,并在初始化时在HyperLinkActivity中创建DriverTabHelper。

我建议使用Google搜索:"重构切换语句"

abstract class HyperLinkActivity {
    private DriverTabHelper driverTabHelper;

    public HyperLinkActivity(DriverTabHelper driverTabHelper) {
        this.driverTabHelper = driverTabHelper;
    }

    public void startTask() {
        Runnable aSyncTask = () -> { implementation() }
        driverTabHelper.execAsyncTaskThatLaunchesATab(Objects.requireNonNull(aSyncTask, "invalid link specified"));
    }

    abstract void implementation();
}

class CookieHyperLink extends HyperLinkActivity {
    public void implementation() {
        loginPage.openCookieInformationPage();
        loginPage.switchToNewestTab();
    }
}

class HyperlinkService {
    private DriverTabHelper driverTabHelper;

    public void HyperLinkService(DriverTabHelper driverTabHelper) {
        this.driverTabHelper = driverTabHelper;
    }


    public void createCookieActivity() {
        CookieHyperLink cookieHyperLink = new CookieHyperLink(driverTabHelper);
        handleHyperLinkTask(cookieHyperLink);
    }

    public void handleHyperLinkTask(HyperLinkActivity hyperLinkActivity) {
        hyperLinkActivity.startTask();
    }
}