通过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中的类和接口实现不同的用户类型的主要内容,如果未能解决你的问题,请参考以下文章