问题
我是设计模式的新手,并且一直在研究这本书,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();
}
}
就个人而言,我觉得这似乎有点过分或混乱......更好的方法来做到这一点?
答案 0 :(得分:2)
我非常喜欢......虽然看起来确实很臃肿。
我可能只是使用继承。管理员扩展主持人扩展成员实现UserType。
所需的其他方法行为
我认为这会更简单,但不那么聪明
答案 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接口,默认情况下从超级接口获取所有操作。同样,其他实现类实现相应的接口。我不知道它是哪种模式,但我觉得看起来很干净。