我有两种不同类型的用户,我将它们映射到两个

Java类UserWheel和UserSea,它们有一个名为User的公共抽象超类.为这些用户类型保存的数据大致相同,但行为不同.

然后我创建了一个名为UserCollection的抽象类,其派生类UserWheelCollection和UserSeaCollection用于搜索子用户或加载子用户.

然后我添加了一个带签名的UserCollection类的抽象方法

public abstract List listAllSubusers()

这是因为实施会有所不同.创建的每个用户将是UserWheel或UserSea,具体取决于调用的方法,但实现的其余部分完全不同.

然后我想用签名公共用户loadById(int idUser)向UserCollection添加一个新方法.在这种情况下,实现将是相同的,除了用户返回的事实将是UserWheel或UserSea的实例.在这种情况下,我不愿意在基类中使用抽象方法,因为代码重复.

我可以使用instanceof检查UserCollection的具体类,并创建一个合适的子类,但它似乎不是面向对象的,并打破了开放原则.

另一个想法是将一个抽象方法createNewUser()添加到UserCollection,并在子类中添加具体实现以返回一个新实例,因此基类将只调用此createNewUser()方法.

你认为第二条道路有意义吗?或者你会以不同的方式组织事情以及如何组织?

UPDATE.目前的情况是:

abstract class User
public String getAddress()
public void setAddress()
...
class UserSea extends User
class UserWheel extends User
abstract class UserCollection
protected abstract User createNewUser();
public abstract List listAllSubUsers();
public User loadById(int idUser) {
User newUser = createNewUser();
//populate it
return newUser;
}
class UserSeaCollection
protected User createNewUser() {
return new UserSea();
}
public List listAllSubusers()
class UserWheelCollection
protected User createNewUser() {
return new UserWheel();
}
public List listAllSubusers()

我试图理解如trashgod所建议的策略模式,这是我的第一次尝试:

interface SubuserManagement
List listAllSubUsers();
...
interface UserCrud
void create();
User readById(int idUser);
void update();
void delete();
class UserSeaCollection implements SubUserManagement, UserCrud
private SubUserManagement subuserBehavior = new SubUserManagementSeaImplementation();
private UserCrud userCrudBehavior = new UserCrud();
void create {
subUserBehavior.create();
}
...
class UserWheelCollection implements SubUserManagement, UserCrud
...
class SubUserManagementWheelImplementation implements SubUserManagement
List listAllSubUsers();
class SubUserManagementSeaImplementation implements SubUserManagement
List listAllSubUsers();
class UserCrudImplementation implements UserCrud //only 1 implementation
void create();
User readById(int idUser);
void update();
void delete();

在第一次尝试中,我创建了UserCollectionWheel和UserCollectionSea,它们不再共享一个公共超类,而是实现相同的接口.实际的实现是在外部类中.

现在UserCollectionWheel和UserCollectionSea实际上是同一个类,唯一不同的是我分配给它们的行为.或者,我只能用setter编写一个类:

UserCollection userColl = new UserCollection();
userColl.setSubUserBehavior(new SubUserManagementSeaImplementation());
userColl.setCrudBehavior(new UserCrud());

但是初始化会很麻烦,特别是如果我有更多的行为类.那么我做错了什么?如何妥善组织?

更新2:我用我实现的设计写了一个blog post.