有四种用户类型。管理员,超级版主,主持人和会员。管理员可以添加和删除所有类型的用户类型,包括管理员,可以添加主要主题,但他无法上传文档和项目。超级版主可以为任何创建的主题添加主持人或成员。超级版主可以上传和删除文档和项目。项目有集团项目,个人项目,截止日期等。但是文档也有类型,如pdf(书籍),ppt(幻灯片),网址。主持人可以是其他主题的成员,可以查看与该主题相关的项目。会员可以注册所需的主题,并可以添加项目。
问题是这里我缺乏设计oop概念。我无法建立层次结构。 我真的不想要完整的代码只需要帮助解决问题的方法。据我所知,这只是主持人和成员之间的关系。我已用C语言编程了。但是,我还没有熟悉OOP。顺便说一下,我弄清了与问题相关的逻辑,但我还不能用OOP概念编写。如何提出解决方案?我想我需要层次结构。最后,可能有多个数据访问,因为如果由admin创建的成员,它也应该由超级版主管理,并且可以使用界面,因为管理员和超级版主添加和删除。
答案 0 :(得分:0)
您的用例并不完全清楚,但是如果您尝试为用户及其权限建模。这可能是我的第一次迭代:
不是试图覆盖一个类层次结构中的所有内容,也许您可以通过不同的类对不同方面进行建模。我的意思是:用户,权利,行动。用户可能看起来像这样:
public interface User {
boolean isAllowed(Action action);
}
权利实际上是一个谓词,一个函数Action -> Boolean
:
public interface Right<A extends Action> extends Predicate<A> {
Class<A> getActionType();
}
这个东西有一个test(action)
方法然后返回一个布尔值,是否允许给定的动作。因此,所有4种类型的用户都应该扩展这个基类:
public abstract UserWithRights implements User {
private final List<Right<?>> rights;
private UserWithRights(List<Right<?>> rights) {
...
}
@Override
public boolean test(Action action) {
// search for right with same action type and test it
}
}
重点是,所有用户都将拥有一份分配的权限列表。我使权利列表不可变,但如果它更适合你,你可以使它变得动态。
所以admin
将以这种方式定义:
public class Admin extends UserWithRights {
public Admin(...) {
super(asList(
staticRight(AddUser.class, true),
staticRight(AddMainTopic.class, true));
...
}
}
这些都是静态权利,因为他们不需要动作中的任何参数。但是有动态权限,例如moderator
只允许查看有关她分配给的主题的项目:
dynamicRight(ViewProject.class, view -> isAssignedToTopic(view.getTopic()));
所以无论如何,这可能是人们可以开始......