例如,考虑我有一个可供其他类扩展的类:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
和一些子类:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
实际上,子类没有任何方法可以覆盖,也不会以通用方式访问HomePage,即:我不会做类似的事情:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
我只想重用登录页面。但是根据https://stackoverflow.com/a/53354,我在这里更喜欢合成,因为我不需要LoginLog接口,所以在这里我不使用继承:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
但问题出在新版本的代码中:
public LoginPage loginPage;
添加新类时重复。而且,如果LoginPage需要使用setter和getter,则需要复制更多代码:
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
所以我的问题是,“构成继承”违反了“枯燥原则”吗?
extends LoginPage
到处都会重复。检查伴侣!
LoginPage
装饰器。不再需要重复,只需简单page = new LoginPage(new EditInfoPage())
操作即可完成。或者,您可以使用open-closed-principle来制作可以动态添加到任何页面的身份验证模块。有很多方法可以处理代码重复,主要包括查找新的抽象。LoginPage
可能是一个不好的名字,您想要确保的是,用户在浏览该页面时已通过身份验证,同时被重定向到LoginPage
或显示正确的错误消息(如果不是)。