0

这段代码是否适合策略模式?

public function isValidEmail($email, $organization)
{   
    switch ($organization) {
        case 'USAF':
        case 'Army':
        case 'USMC':
        case 'Navy':
        case 'SOCOM':
            return (preg_match('/[.]mil$/i', $email) === 1);
            break;

        case 'Federal Gov.':
            return (preg_match('/[.]gov$/i', $email) === 1);
            break;

        case 'State/Local Gov.':
            $regionCollection = Mage::getModel('directory/region')
                ->getResourceCollection()
                ->addCountryFilter(array('US'))
                ->load();

            $stateAbbr = array();

            // Cycle through state abbreviations for match
            foreach ($regionCollection as $region) {
                $stateAbbr[] = strtolower($region->getCode());
            }
            $states = implode('|', $stateAbbr);

            return (preg_match("/[\.|@]{1}($states){1}\.us$/i", $email) ===
            break;

        case 'USCG':
        case 'DOD':
        case 'Defense Industry':
            return true;
            break;

        default:
            return false;
            break;
    }
    // It got past somehow?
    return false;
}

我假设您可以有一个简单的接口来定义验证方法,但我对如何处理 switch 语句中返回 true/false w/没有电子邮件逻辑的两个奇怪的球情况有点困惑。

interface ValidInterface
{
    public function isValid($email);
}
4

2 回答 2

2

您的验证器界面正走在正确的轨道上(我将其命名为更有意义的名称,例如EmailValidator)。然后,您可以创建组织到验证器的映射,并在执行验证时进行查找:

private $validators = array(
  'USAF' => new MilitaryEmailValidator(),
  'Army' => new MilitaryEmailValidator(),
  ...
  'Defense Industry' => new TrueEmailValidator()
);

public function isValidEmail($email, $organization) {
  if (isset($this->validators[$organization]))
    return $this->validators[$organization])->isValid($email);

  // default return
  return false;
}
于 2012-08-28T02:33:47.820 回答
0

我认为这里的相关设计模式是责任链。它本质上是 switch 语句的面向对象版本。您有一个对象列表(或树)。他们每个人都有能力确定他们是否应该处理这个问题(相当于“案例”陈述)。如果他们不这样做,则将决定传递给继任者(下一个“案例”声明)。你可能有也可能没有一个包罗万象的东西,相当于“默认:”语句。

为什么然后使用责任链而不是 switch 语句或建议的字符串到对象的映射?

我认为它们是实现相同目标的特定实现。更通用的实现可能会给您更多的自由度或类型安全性。switch 解决方案对您可以在每个案例中放置的代码数量/您可以可靠地处理和维护的案例数量施加了非常实际的限制。恰当的例子:在您的代码中,state/gov 的分支非常复杂,将其放在对象或方法中会相当大地清理代码。

于 2012-08-28T05:08:57.913 回答