0

我参与了一个应用程序迁移项目。这个应用程序应该根据当前用户角色执行一些逻辑,所以像这样的片段在代码中无处不在:

if ("Role1".equals(user.getUserRole())){
    operationVersionForRole1();
} else if ("Role2".equals(user.getRole())){
    operationVersionForRole2();  
} else if ("Role3".equals(user.getRole())){
    operationVersionForRole3();
}

大约有五个角色和近五十个操作,有些角色的操作非常复杂(将近 1000 行代码),因此这种编程风格使源代码变得混乱且难以遵循。是否有任何已知的设计模式可以帮助在这种情况下组织源代码?嵌套的“if-else”感觉不对。

4

3 回答 3

3

它不是一个抽象工厂,它提供了一个接口来创建相关或依赖对象的系列,而无需指定它们的具体类吗?指定的角色将是创建具体实现的参数。并且operationVersionForRoleX可以设计为不同的IOperation接口实现或策略。

interface IOperation  
{ 
    void Execute();
}

class OperationVersionForRoleX : IOperation
{
    public void Execute()
    {
        // …
    }
}

string role = "roleX";
IOperation operation = operationFactory.Create(role);
operation.Execute();
于 2012-07-29T17:10:38.957 回答
1

类似于卡萨布兰卡的回答。

  • 我通常会避免枚举内部的业务逻辑,因为它们的工作只是唯一性,而且在其他所有方面都比不上类。

    公共枚举角色{

    ROLE1 { public Actions getActions(){ return new Role1Actions() } },
    ROLE2 { public Actions getActions(){ return new Role2Actions() } },
    ROLE3 { public Actions getActions(){ return new Role3Actions() } };
    

    }

  • 我会使用尽可能多的方法创建 Actions 接口,每个角色可以执行的操作类型

公共接口操作{

void action1();
// useful when there are more than 1 different actions per role
// even if only 1 now, there will be more in the future
vpod action2();
}
  • 然后,只需使用您可以从角色中获得的操作

    user.getUserRole().action1();

    user.getUserRole().action2();

于 2012-07-29T17:27:20.950 回答
0

你可以做这样的事情,其中​​所有操作都扩展了Operation超类并且Role是一个实际的对象而不是一个字符串:

public abstract class Operation {
  public void execute(User user) {
    user.getRole().apply(this);
  }

  public abstract void operationForRole1();
  public abstract void operationForRole2();
  public abstract void operationForRole3();
}

public enum Role {
  ROLE1 { public void apply(Operation op) { op.operationForRole1(); } },
  ROLE2 { public void apply(Operation op) { op.operationForRole2(); } },
  ROLE3 { public void apply(Operation op) { op.operationForRole3(); } };

  public abstract void apply(Operation op);
}

然后每个都Operation实现各种角色的逻辑,客户端只需调用operation.execute(user). 没有if-else任何地方。

于 2012-07-29T17:07:44.567 回答