Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 你会在这里使用战略模式吗?_Php_Design Patterns - Fatal编程技术网

Php 你会在这里使用战略模式吗?

Php 你会在这里使用战略模式吗?,php,design-patterns,Php,Design Patterns,此代码是否适合策略模式 public function isValidEmail($email, $organization) { switch ($organization) { case 'USAF': case 'Army': case 'USMC': case 'Navy': case 'SOCOM': return (preg_match('/[.]mil$/i', $

此代码是否适合策略模式

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而不返回电子邮件逻辑的两个奇怪的情况有点困惑

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

您的验证器界面走上了正确的轨道(我会给它起个更有意义的名字,比如
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;
}

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

那么,为什么要使用责任链而不是switch语句或提议的字符串到对象的映射呢


我认为它们是实现相同目标的具体实现。更通用的实现可能会为您提供更多的自由度或类型安全性。switch解决方案对每种情况下可以放入的代码数量/可以可靠地处理和维护的情况数量施加了非常实际的限制。举个例子:在你的代码中,state/gov的分支相当复杂,把它放在一个对象或一个方法中会清除大量的代码。

你不需要在
返回后
中断
。使用
\.
而不是
[.]
。我很抱歉地说,责任链与此无关,我想进一步说明你为什么这么认为?这是这类问题的一般解决方案,但由于我所说的原因,它可能有些过分。您的
TrueEmailValidator::isValid()
false EmailValidator::isValid()
方法看起来如何?他们是否仍然遵循界面并接受
$email
参数,然后忽略它并分别返回true/false?这就是我最初所走的道路,但我质疑这种忽略这些参数的非常具体的方法。这被认为是好的做法吗?@veilig:是的,他们会忽略
$email
。这种方法没有本质上的错误——拥有接口的整个想法是,你不在乎它是如何实现的。