我正在处理一个处理Web应用程序登录的控制器。这些登录将来自多个客户端,但都包含相同的数据。但是,根据客户端的不同,这些数据将被不同地解释为我们的webapp的常见实体。
例如,我们有一个被发送的用户代码,在一种情况下,我们可以使用代码的前四位数字,在另一种情况下,代码的12位数字可以映射到用户实体上的字段。
我不想在控制器中处理这一切,而且如果逻辑块有大的讨厌,我想使用一种模式来处理这些信息如何被摄取到我们的应用程序中。
你有什么看法?
答案 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();