在类之间共享对象并创建层次结构

时间:2016-02-23 05:44:54

标签: java oop design-patterns

有四种用户类型。管理员,超级版主,主持人和会员。管理员可以添加和删除所有类型的用户类型,包括管理员,可以添加主要主题,但他无法上传文档和项目。超级版主可以为任何创建的主题添加主持人或成员。超级版主可以上传和删除文档和项目。项目有集团项目,个人项目,截止日期等。但是文档也有类型,如pdf(书籍),ppt(幻灯片),网址。主持人可以是其他主题的成员,可以查看与该主题相关的项目。会员可以注册所需的主题,并可以添加项目。

问题是这里我缺乏设计oop概念。我无法建立层次结构。 我真的不想要完整的代码只需要帮助解决问题的方法。据我所知,这只是主持人和成员之间的关系。我已用C语言编程了。但是,我还没有熟悉OOP。顺便说一下,我弄清了与问题相关的逻辑,但我还不能用OOP概念编写。如何提出解决方案?我想我需要层次结构。最后,可能有多个数据访问,因为如果由admin创建的成员,它也应该由超级版主管理,并且可以使用界面,因为管理员和超级版主添加和删除。

1 个答案:

答案 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()));

所以无论如何,这可能是人们可以开始......