用户多组织java_java – 如何使用两种不同类型的用户组织OO设计

博客讨论了如何在Java中处理具有不同行为的多组织用户。作者提出使用User抽象超类和UserWheel、UserSea子类来表示不同类型的用户。然后,他们介绍了UserCollection抽象类及其子类,用于管理和搜索用户。文章探讨了如何在不违反开放封闭原则的情况下,设计loadById(int idUser)方法。最后,作者提出了使用策略模式来解耦用户行为,并提供了一个示例代码,展示了如何使用策略模式来处理用户列表的不同实现。
摘要由CSDN通过智能技术生成

我有两种不同类型的用户,我将它们映射到两个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.

解决方法:

不要继承行为,而是考虑使用strategy pattern中的接口封装它.用户在使用接口ListSubUsersStrategy,接口CreateUserStrategy等两个具体实现时会有所不同.

附录:在下面的示例中,每个用户都有一个查找子用户的具体策略.特别是,listAllSubUsers()调用接口方法,自动分派到正确的具体实现.该模式并不能减轻您编写接口的具体实现,但它确实解耦了它们,确保更改它不会破坏另一个.

安慰:

A has wheel users.

B has sea users.

C has wheel users.

码:

import java.util.ArrayList;

import java.util.List;

/** @see https://stackoverflow.com/questions/6006323 */

public class UserMain {

private static final List users = new ArrayList();

public static void main(String[] args) {

users.add(new User("A", new WheelStrategy()));

users.add(new User("B", new SeaStrategy()));

users.add(new User("C", new WheelStrategy()));

for (User user : users) {

user.listAllSubUsers();

}

}

private static class User {

private String name;

private SubUsersStrategy suStrategy;

public User(String name, SubUsersStrategy suStrategy) {

this.name = name;

this.suStrategy = suStrategy;

}

public void listAllSubUsers() {

System.out.print(name + " manages ");

List subUsers = suStrategy.getList();

}

}

private interface SubUsersStrategy {

List getList();

}

private static class WheelStrategy implements SubUsersStrategy {

@Override

public List getList() {

System.out.println("wheel users.");

return null;

}

}

private static class SeaStrategy implements SubUsersStrategy {

@Override

public List getList() {

System.out.println("sea users.");

return null;

}

}

}

标签:java,oop,design-patterns

来源: https://codeday.me/bug/20190730/1578469.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值