2011-02-03 86 views
3

我只是无法弄清楚我应该采用哪种设计模式。说我有这样的课程:我应该使用哪种设计模式来建模人与角色关系?

class Person 

String role; 

public void takeRole(String role) { 
    this.role = role; 
} 

public void do() { 

    switch(role) 

    case a: 
     do this and that; 
     this.role = b; 

    case b: 
     do this and that; 

    case c: 
     do this and that; 
     this.role=a; 

    .... 

总之,一个人有角色和do()方法取决于他的角色是什么。在某些情况下,他可能不得不转换角色。我认为这个do()应该被抽象(更多的是因为将来可能会定义其他角色)---但是怎么做呢?是否应该有一个角色类?

任何帮助将不胜感激。

编辑:

感谢您的保时,人。我想补充一点。我确实认为(至少作为一个想法)许多建议的解决方案。以下是我的困难:如果我将人员类(如PersonTypeA,personTypeB等)分类并将每个特定角色分配给相应的人员类型,那么在切换角色时会遇到困难(例如,工程师成为会计师! ---很奇怪,至少可以说

另一方面,如果我为每个角色创建类,那么(1)角色感觉不像一个对象,因为(至少在我的情况下)是一个角色没有属性,只有方法,因此,role_A_1与role_A_2没有什么不同,但是对于每个人我都必须创建一个新的角色对象 - 即使它们共享相同的角色。我不确定自己是否清楚,我不确定我的观点是否合理。

+0

所以用户永远不会有2+的角色,在同一时间。 IE:领导,开发人员? – 2011-02-03 18:48:06

+0

感谢您的回复。我会再想一想,回到你身边。 – blackened 2011-02-04 10:43:01

+0

如果您想提供更多信息,请更新您的问题或留下意见。我已将您留下的答案转换为评论。 – 2011-02-04 10:44:19

回答

7

不在设计模式的方式,但更以逻辑方式:

而是有一个巨大的“如果角色是这样的,这样做,否则,如果是这种”声明,使用DoThis()方法的某种Role类会更容易。

一个人有一个角色。一个人可以DoThis(),那个角色也可以DoThis()。

而不是一个人说他们根据角色所做的事情,角色说他们可以做什么。

0

我会做一个接口与做法,像

interface Action { 
    void do() 
} 

,然后定义Map<String, Action>,使之发出一定的作用,相关的行动可以通过actionMap.get(role)检索。然后只需拨打do()就行动了actionMap.get(role).do()

5

我看到State Pattern这里也出现了。通过询问其当前分配Role对象做

interface Role { 
    public void doRole(Context context); 
} 

class RoleA implements Role { 
    public void doRole(Context context) { 
     // do this and that 
     context.setRole(new RoleB()); 
    } 
} 

class RoleB implements Role { 
    public void doRole(Context context) { 
     // do that and this 
     context.setRole(new RoleA()); 
    } 
} 

class Context { 
    private Role _role; 

    public Context() { 
     // set initial role 
     setRole(new RoleA()); 
    } 

    public void setRole(Role newRole) { _role = newRole; } 

    public doSomething() { 
     _role.doRole(this); 
    } 
} 

在这个例子中,你委派Context对象所做的行为:例如,你可以沿着线设计的东西。具体角色本身具有定义角色之间转换的方法。实际上,这里出现的是一个简单的状态机,其中具体的Roles是节点并且调用setRole()边缘。

0

我会说一个角色是一个人。我有一个Role接口,它的具体实现会包装一个Person并用我需要的任何新功能来装饰它。

public interface Role 
{ 
    Person getPerson(); 
    void action(); // might need more here 
}; 

public class Person 
{ 
    // whatever fields you need 
} 

public class Admin 
{ 
    private Person person; 

    public Admin(Person p) { this.person = person; } 

    public void action() { } // some some admin stuff. 
} 
1

你可能想看看COAD的域名中性组分:

http://www.petercoad.com/download/bookpdfs/jmcuch01.pdf

这与多重角色的人,而是由包括事件(时刻间隔)还需要的东西一点。他还谈论了很多关于颜色建模的内容,这很有趣,但不要让它让你失望 - 我认为这些想法非常合理。

伊恩。

1

我发现处理人员,公司和角色是一再重复的事情。马丁福勒的分析模式书(与沃德坎宁安和拉尔夫杰克逊)有一个广泛的讨论,值得深入阅读。

在线版本的“处理角色”一章(或其摘要,我没有这本书方便)可以找到:http://martinfowler.com/apsupp/roles.pdf

Martin Fowler的网站也有一整节处理分析模式:http://martinfowler.com/apsupp/roles.pdf

相关问题