【问题标题】:Implementing different user types through classes and interfaces in Java通过Java中的类和接口实现不同的用户类型
【发布时间】:2012-02-02 18:56:16
【问题描述】:

问题
我对设计模式还很陌生,并且一直在学习《Head First Design Patterns》这本书。我需要实现一个具有 3 种用户的系统:会员、版主、管理员。版主可以执行会员可以执行的所有操作以及添加的内容,管理员可以执行版主可以执行的所有操作以及添加的内容。我已经对如何使用接口和类实现了一个基本的草图;由于缺乏经验,我需要来自 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();
    }
}

就个人而言,我觉得这似乎有点过头或令人困惑......更好的方法吗?

【问题讨论】:

  • 会员、版主、管理员。 IMO,这些在您的应用程序中应该是不同的角色。

标签: java design-patterns user-roles


【解决方案1】:

我很喜欢它……不过确实显得臃肿。

我可能只使用继承。 Admin 扩展 Moderator 扩展 Member 实现 UserType。

  • UserType 接口可以定义你所有的方法
  • 成员可以实现所有方法,但非行为
  • 主持人可以从成员继承并覆盖它需要行为的方法
  • 管理员可以从 Moderator 继承并覆盖它需要行为的其他方法

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

  • 【讨论】:

    • 啊哈!在我写下来之前,我就想到了这样的事情,但我在类中思考......在这种类型的继承中使用接口也有效!我希望我能投票赞成。
    【解决方案2】:

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

    为什么没有界面成员,版主扩展它,管理员扩展版主?

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

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

    【讨论】:

    • 是的,这是我应该坚持的。 Edd 提到了你在这里解释的内容,但这并不完全正确......
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我认为您可以通过将成员接口作为超级接口来简化这一点。版主界面扩展了会员界面,管理员扩展了版主界面。这样,管理员就可以获得会员和版主的所有权限。 Admin 成员实现类将扩展 Admin 接口,默认情况下从超级接口获取所有操作。同理,其他实现类实现对应的接口。不知道是什么花纹,但是感觉挺干净的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        • 2015-08-03
        相关资源
        最近更新 更多