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

Posted

技术标签:

【中文标题】通过Java中的类和接口实现不同的用户类型【英文标题】:Implementing different user types through classes and interfaces in 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,这些在您的应用程序中应该是不同的角色。 【参考方案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 接口,默认情况下从超级接口获取所有操作。同理,其他实现类实现对应的接口。不知道是什么花纹,但是感觉挺干净的。

【讨论】:

以上是关于通过Java中的类和接口实现不同的用户类型的主要内容,如果未能解决你的问题,请参考以下文章

java接口和类有啥区别?

Java中的接口

、接口与类的区别;

(类对象和接口)

抽象类和接口的异同?

Java 接口