有关if ... else语句的设计模式

时间:2019-04-03 14:16:49

标签: if-statement design-patterns

我是设计模式领域的新手,在处理包含多个条件的传统场景时遇到麻烦。

假设我有一个服务(例如打印机),该服务具有多个属性并且取决于不同的参数(例如Department,Documenttype)。如果要验证特定参数组合的属性设置是否正确,最终会遇到很多if ... else条件。

在伪代码中,它看起来像这样:

class Printer 
{
  AttributeA a;
  AttributeB b;
  AttributeC c;
  ...
  checkAttributeA(Department departement, Documenttype doctype);
  checkAttributeB(Department departement, Documenttype doctype);
  checkAttributeC(Department departement, Documenttype doctype);
  ...
 };

Printer::checkAttributeA(Department departement, Documenttype doctype)
{
  if (department == DepartmentA) 
  {
     if (doctype == DocumenttypeA) 
     {
        // do somthing
     } 
     else if (doctype == DocumenttypeB) {
        // do somthing else
     } 
     ...
  }
 else if (department == DepartmentB) 
  {
     if (doctype == DocumenttypeA) 
     {
        // do somthing
     } 
     else if (doctype == DocumenttypeB) {
        // do somthing else
     } 
     ...
  }
...
}

在采取策略模式的情况下,如果我正确地获得了此条件,则需要为每个条件创建一个类。但是,由于条件/类的数量随每个参数成指数增长,因此不确定是否正确。有适当的方法来处理这种情况吗?

1 个答案:

答案 0 :(得分:1)

假设有M个部门和N个文档类型,并且对于这两个值的每种可能的组合,必须采取不同的操作。

这样的问题陈述具有内在的复杂性,您无法消除定义所有这些动作(M x N)的含义,并且如果打印机的每个属性导致以下每种可能的组合的动作都不相同部门和文档类型,那么您还必须分别定义它们。

考虑一个四维矩阵。第一个维度是属性,第二个维度是部门,第三个维度是文档类型,第四个维度是将这三个值组合起来要采取的相应操作。

您至少必须定义这些操作:

var matrix = {
  AttributeA: {
    DepartmentX: {
      DocumentP: SomeActionA,
      DocumentQ: AnotherActionA
    },
    DepartmentY: {
      DocumentP: SomeActionB,
      DocumentQ: AnotherActionB
    }
  },
  AttributeB: {
    // similar structure
  },
  // and so on...
};

现在,您可以使用一个函数来接收您的属性,部门和文档类型并执行操作:

function takeAction(attribute, department, documentType) {
  // maybe do a sanity check of your inputs
  matrix[attribute][department][documentType](); // calling the action!
}

这样,您还将可配置数据与通用逻辑分离。