Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该使用哪种设计模式来模拟人员角色关系?_Java_Design Patterns - Fatal编程技术网

Java 我应该使用哪种设计模式来模拟人员角色关系?

Java 我应该使用哪种设计模式来模拟人员角色关系?,java,design-patterns,Java,Design Patterns,我只是不知道我应该在这里采用哪种设计模式。假设我有这样的课: 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;

我只是不知道我应该在这里采用哪种设计模式。假设我有这样的课:

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()(因为将来可能会定义其他角色,所以更应该抽象)——但是如何抽象呢?应该有一个角色类吗

任何帮助都将不胜感激

编辑:

谢谢大家抽出时间。我想补充一点。我确实考虑过(至少作为一个想法)许多建议的解决方案。以下是我的困难:如果我将Person类(如PersonTypeA、personTypeB等)划分为子类,并将每个特定角色分配给适当的Person类型,那么我在转换角色时就会遇到困难(例如,工程师变成了会计师!——至少可以说很奇怪

另一方面,如果我为每个角色创建类,那么(1)角色感觉不像对象,因为(至少在我的例子中)角色没有属性,只有方法。因此,角色1和角色2没有区别。但是对于每个人,我必须创建一个新的角色对象——即使他们都共享同一个角色


我不确定我是否说得很清楚,我也不确定我的观点是否有意义。

不是从设计模式的角度,而是从逻辑的角度来看:

与使用一个巨大的“if role is this,do that,else if is this”语句不同,使用DoThis()方法的某种role类会更容易

一个人有一个角色。一个人可以做this(),然后这个角色也可以做this()


而不是一个人根据角色说他们做什么,角色说他们能做什么。

我会用do方法制作一个界面,比如

interface Action {
    void do()
}
然后定义一个
Map
,这样给定一个角色,相关的动作可以通过
actionMap.get(role)
检索。然后只需通过
actionMap.get(role.do()

对动作调用
do()
,我看到这里也出现了一个新的动作。例如,您可以按照以下思路设计一些东西:

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);
    }
}

在本例中,通过请求当前分配的
角色
对象来委托
上下文
对象的行为。具体角色本身具有定义角色之间转换的方法。实际上,这里出现的是一个简单的状态机,其中具体的
角色
是节点和调用我想说的是,一个角色有一个人。我会有一个角色接口,它的具体实现将包装一个人,并用我需要的任何新功能装饰它

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.
}

您可能想看看Coad的领域中立组件:

这有多个角色的人,但通过包括事件(瞬间间隔)使事情变得更进一步。他还谈到了很多关于彩色模特的话题,这很有趣,但不要让它让你感到不快——我认为这些想法很好


伊恩。

我发现,与人、公司和角色打交道是一件反复重复的事情。马丁·福勒(Martin Fowler)的《分析模式》一书(与沃德·坎宁安和拉尔夫·杰克逊合著)进行了广泛的讨论,值得深入阅读

“处理角色”一章的在线版本(或其摘要,我手头没有这本书)可以在以下位置找到:


Martin Fowler的网站也有一个完整的部分处理分析模式:

因此用户永远不能同时拥有2个以上的角色。例如:Lead,Developer?感谢您的回复。我会再考虑一下,然后回复您。如果您想提供更多信息,请更新您的问题或留下评论。我已将您的答案转换为l参考注释。吹毛求疵:
do
是一个关键字,像
do()
这样的方法不会编译;)我将编辑我的答案。我只是离开了OP发布的代码。;-)