2

问题
我对设计模式还很陌生,并且一直在学习《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();
    }
}

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

4

4 回答 4

2

我很喜欢它……虽然看起来很臃肿。

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

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

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

  • 于 2012-01-04T21:35:11.867 回答
    1

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

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

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

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

    于 2012-01-04T21:40:50.050 回答
    0

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

    于 2012-01-04T21:25:54.103 回答
    0

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

    于 2012-01-04T21:29:29.233 回答