通过Java中的类和接口实现不同的用户类型

时间:2012-01-04 21:22:00

标签: java design-patterns user-roles

问题
我是设计模式的新手,并且一直在研究这本书,Head First Design Patterns。我需要实现一个包含3种用户的系统:Member,Moderator,Admin。主持人可以执行会员可以执行的所有操作,以及添加的内容,管理员可以执行主持人可以执行的所有操作,以及添加的内容。我已经做了一个基本的草图,说明如何使用接口和类来实现它;由于缺乏经验,我需要来自SO社区的有关此设计的建议 - 无论是过于臃肿还是愚蠢,还是需要更正。所以请耐心等待。

可能的解决方案
以下是接口:

public interface AdminBehavior
{
    public addUser();
    public deleteUser();
}

public interface ModeratorBehavior
{
    public blockUser();
    public deletePost();
}

行为类:

public class AdminBehaviors implements AdminBehavior
{
    public addUser()        {
        ...
    }
    public deleteUser()     {
        ...
    }
}

public class NoAdminBehaviors implements AdminBehavior
{
    public addUser()        {
        ...//cannot do
    }
    public deleteUser()     {
        ...//cannot do
    }
}

+ Same as above done for Moderators...classes ModeratorBehaviors and NoModeratorBehaviors

实际用户类:

public class Member
{
    protected ModeratorBehavior moderatorBehavior;
    protected AdminBehavior adminBehavior;

    public Member()     {
        moderatorBehavior = new NoModeratorBehavior();
        adminBehavior = new NoAdminBehavior();
    }

    public login()      {
        ...
    }
    public logout()     {
        ...
    }
    public post()       {
        ...
    }
    public comment()        {
        ...
    }

    //Moderator priv'ed actions
    public blockUser()      {
        moderatorBehavior.blockUser();
    }
    public deletePost()     {
        moderatorBehavior.deletePost();
    }

    //Admin priv'ed actions
    public addUser()        {
        adminBehavior.addUser();
    }
    public deleteUser()     {
        adminBehavior.deleteUser();
    }
}

public class Moderator extends Member
{
    public Moderator()  {
        moderatorBehavior = new ModeratorBehavior();
        adminBehavior = new NoAdminBehavior();
    }
}

public class Admin extends Moderator ((or Member?))
{
    public Admin()  {
        moderatorBehavior = new ModeratorBehavior();
        adminBehavior = new AdminBehavior();
    }
}

就个人而言,我觉得这似乎有点过分或混乱......更好的方法来做到这一点?

4 个答案:

答案 0 :(得分:2)

我非常喜欢......虽然看起来确实很臃肿。

我可能只是使用继承。管理员扩展主持人扩展成员实现UserType。

  • UserType界面可以定义您的所有方法
  • 会员可以实现所有方法,但具有非行为
  • 主持人可以从成员继承并覆盖它需要的行为方法
  • 管理员可以从Moderator继承并覆盖

    所需的其他方法行为

    我认为这会更简单,但不那么聪明

  • 答案 1 :(得分:1)

    如果主持人可以做任何会员所做的事情+更多,管理员可以做任何主持人做的事情+更多。

    为什么没有接口成员,主持人扩展它并且管理员扩展了主持人?

    public interface Member {
      void foo();
    }
    
    public interface Moderator extends Member {
      void bar();
    }
    
    public interface Admin extends Moderator {
      void boo();
    }
    

    我不确定行为是你所描述的最佳方法。

    答案 2 :(得分:0)

    对于初学者来说,管理员肯定应该扩展Moderator,因为管理员拥有所有版主的功能,然后是一些。除非主持人和管理员的界面不同,否则他们应该在新项目(特权用户)中扩展或至少实现行为。成员不应包含prived方法,应将其移至Priviledged用户。在视图中,普通用户不应该能够调用任何prived用户命令,这样做会导致错误,因为“Members”没有这些方法。

    答案 3 :(得分:0)

    我认为你可以通过将Member接口作为超级接口来简化这一过程。 Moderator接口扩展了Member接口,Admin扩展了Moderator接口。这样管理员就可以获得会员和主持人的所有权限。管理员成员实现类将扩展Admin接口,默认情况下从超级接口获取所有操作。同样,其他实现类实现相应的接口。我不知道它是哪种模式,但我觉得看起来很干净。

    相关问题