java - 我应该使用哪种设计模式来模拟人与角色的关系?

标签 java design-patterns

我只是想不出我应该在这里采用哪种设计模式。假设我有这样的类(class):

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 等)子类化,并将每个特定角色分配给适当的人员类型,那么我在转换角色时会遇到困难(例如,工程师变成会计师! ---至少可以说很奇怪。

另一方面,如果我为每个角色创建类;然后 (1) 角色不像对象,因为(至少在我的情况下)角色没有属性,只有方法。因此,role_A_1 与 role_A_2 没有什么不同。但是我必须为每个人创建一个新的角色对象——即使他们共享相同的角色。

我不确定我是否表达清楚,我不确定我的观点是否有道理。

最佳答案

不是以设计模式的方式,而是以逻辑的方式:

与其使用一个巨大的“如果角色是这个,就做那个,否则如果是这个”这样的语句,某种带有 DoThis() 方法的 Role 类会更容易。

一个人有一个角色。 Person 可以 DoThis(),然后 Role 也可以 DoThis()。

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

关于java - 我应该使用哪种设计模式来模拟人与角色的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4890326/

相关文章:

java - 如果我在 java 中调用我的主类的一个函数,从其他有自己线程的对象,这个函数会在单独的线程中运行吗?

java - 在java中为什么我们不能直接将int赋值给char???但反之亦然?

c# - 好的 asp.net (C#) 应用程序?

php - 如何在 php 中实现享元模式?

c++ - 如何在 C++ 中处理具有多个不同类型数据成员的类?

java - 无法使用多态访问具体类的唯一属性

java - 在示例中使用 Null

java - 绘制不同用户类型的用例图的正确方法

Java小端顺序

java - 构建器模式代替方法重载