搜索正确的模式以处理登录数据

时间:2010-05-12 16:49:44

标签: design-patterns web-applications login

我正在处理一个处理Web应用程序登录的控制器。这些登录将来自多个客户端,但都包含相同的数据。但是,根据客户端的不同,这些数据将被不同地解释为我们的webapp的常见实体。

例如,我们有一个被发送的用户代码,在一种情况下,我们可以使用代码的前四位数字,在另一种情况下,代码的12位数字可以映射到用户实体上的字段。

我不想在控制器中处理这一切,而且如果逻辑块有大的讨厌,我想使用一种模式来处理这些信息如何被摄取到我们的应用程序中。

你有什么看法?

2 个答案:

答案 0 :(得分:1)

如果不了解您的程序目前的工作原理,很难准确理解问题所在。但是,如果我理解正确,你实际上并不需要这样的“模式”。

我只是简单地将“令人讨厌的逻辑块”重构为一个处理决定如何处理数据的类。也许是这样的(PHP代码):

class UserCodeHandler {

 private $userCode;
 private $client;

 public function __construct($userCode, $client) {

  $this->userCode = $userCode;
  $this->client = $client;
 }

 public function manipulateData() {

  switch ($this->client) {
   case 'clientA':
    $this->doSomething();
    break;
   case 'clientB':
    $this->doSomethingElse();
    break;
  }
 }

 private function doSomething() {
  //does stuff with first 4 digits of the user code.
 }

 private function doSomethingElse() {
  //does stuff with 12 digits of the user code.
 }
}

然后您可以像这样使用它:

$userCodeHandler = new UserCodeHandler($data, $client);
$userCodeHandler->manipulateData();

这将使所有条件逻辑不在控制器之外,并允许您在其他控制器中重用代码。

答案 1 :(得分:0)

工厂模式适合上述情况。使用工厂模式,您可以在将来为其他客户端类型实现类,而无需修改现有代码。

class Client
{
    public static function factory($client_type)
    {
        $classname = 'Client_' . $client_type;

        return new $classname;
    }
}

class Client_TypeA
{
    public function doSomething()
    {
        // do something specific to TypeA clients
    }
}

class Client_TypeB
{
    public function doSomething()
    {
        // do something specific to TypeB clients
    }
}

$client = Client::factory('TypeA');
$client->doSomething();