2017-08-31 66 views
3

我发现我使用以下模式,当我有一个已知的执行路径之间的几个条件。我将在一个Map中定义我的测试用例(在本例中是一个POJO),并使用这些条件来进行密钥查找。我通常使用术语predicate以下代码模式是否有标准名称?

这个模式是否有标准名称,如果有的话,它的使用历史或上下文是什么?

var predicates = { 
    negateRegexp: function (value, operator) { 
    return !operator.regex.test(value); 
    }, 
    negateOperand: function (value, operator) { 
    return value !== operator.operand; 
    }, 
    affirmRegexp: function (value, operator) { 
    return operator.regex.test(value); 
    }, 
    affirmOperand: function (value, operator) { 
    return value === operator.operand; 
    } 
}; 

var predicateKey = (operator.prefix === '!' ? 'negate' : 'affirm') + 
    (operator.regexp ? 'Regexp' : 'Operand'); 

var testResult = predicates[predicateKey](value, operator); 

if (testResult) { 
    doSomethingWith(value); 
} 

我使用的JavaScript的例子,因为这是我平时的工作中,但我敢肯定,我已经看到了其他语言的这种模式(即使OOP类型的那些如Java)

+2

[Wikipedia/Strategy Pattern](https://en.wikipedia.org/wiki/Strategy_pattern) – no1xsyzy

回答

3

在OOP中,这被称为strategy pattern。鉴于查找表,它也类似于interpreter pattern,但是对于您的情况来说,这非常简单。使用策略导致副作用也可能被称为command pattern,但我认为在您的示例中情况并非如此。

在FP中,这个模式并没有一个特定的名字,它只是你怎么做的 - 虽然查找方法可能被称为高阶函数,因为它返回另一个函数。

顺便说一句,术语predicate通常意味着只是一个返回布尔值的函数,而这适合您的情况,它与抽象模式没有任何关系。

相关问题