哪种模式以及如何构建此[不同的serviceHandlers,结构和验证]?

时间:2013-04-11 10:36:00

标签: php codeigniter design-patterns

好吧所以我试图弄清楚所有这些模式。

好吧,所以我在CodeIgniter中编写了一个应用程序,它需要能够使用SOAP,可能是XML,逗号分隔等将有关汽车和客户的数据发送给不同类型的公司。

但他们都需要同样的事情。

我想让它尽可能地动态,并确保编写测试很容易。

所以服务应该采取一些措施:

  • 处理程序
  • 申请人[1-2]
  • PARAMS
  • 物体

我开始创建不同的类

Gr8Exp NordCar SwePerf

每个实现接口 iServiceRequest

interface iServiceRequest{
    /**
     * Send the request to the company server.
     */
    function sendRequest();
    /**
     * Saves the response into the database.
     */
    function saveResponse();
    /**
     * Prepares the request to the company, setting info from form and shit.
     */
    function prepareRequest();
    /**
     * Soap, XML, CSV, JSON
     * @param type $method
     */
    function setRequestHandler(iServiceRequestHandler $handler);
}

然后他们需要根据我输入的处理程序来构建Soap,XML,CSV,JSON请求。

在需要验证的人(不是全部)之后我使用了:

interface iAdaptServiceRequest{
    /**
     * Structure the array information and put it into an object structure in the right place.
    */
    function structure(array $info);
    /**
     * Make all the checks for the function
     */
    function validateInfo();
}

但是我被卡住了,当我刚刚使用SOAP请求时它工作得非常好;但现在。由于我需要以不同的方式对它们进行格式化,因此对每种类型的请求或公司使用不同的处理程序,我不知道该怎么做。 我可以把它们放在不同的文件夹中,并在不同的文件夹中重新创建该类。但这并不是一个好习惯,因为我正在复制代码。

最后我想运行这样的链接:

$ result = $ m-> prepareRequest() - > sendRequest() - > saveResponse();

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

IMHO:

- 创建/使用前端控制器。

- 前端控制器确定使用哪个请求处理程序(JSON,SOAP,XML等)。

- 请求处理程序生成一个公共“请求”对象,该对象在所有接口中的行为相同,基本上将变量放入“请求对象”中的常见命名格式

- 它确定将请求发送到哪个服务并在那里发送请求对象

- 服务处理请求对象并生成响应对象

- 控制器创建一个适当的(JSON / SOAP / XML)View对象,将响应对象处理为正确的视图类型,View将响应输出为该类型。

答案 1 :(得分:0)

我会使用像你这样的东西:$result = $m->prepareRequest('JSON')->sendRequest()->saveResponse();,但指定我发送的数据格式。

方法prepareRequest(string $type)会检查格式并调用另一种方法将数据转换为相应的格式。

这样的事情:

function prepareRequest(string $type){
     if ($type == 'json'){
          $this->convert2json();
     }
     if ($type == 'xml'){
          $this->convert2xml();
     }
     // And so on
}

答案 2 :(得分:0)

MVC或Observer模式经常出现混乱。这不是适用此模式的情况。在MVC模式中,视图和模型彼此相关。视图必须根据主题信息自行更新。视图和数据库中的基础表是一个很好的例子。这不是你想要的。

适合此问题的设计模式是Builder模式。 Builder模式由四个合作的类型组成: 一个建造者, 2.一个ReaderManager, 3.一个ConverterManager,和 4.一个DataObject。 ReaderManager正在使用Interpreter模式。可以使用State模式完成转换。 ReaderManager(某些DataObject)的输出是ConversionManager的输入。这可以使用抽象类而不是接口(我对数据聚焦类的偏好)来完成。 Builder将ReaderManager与ConverterManager连接起来,负责数据的传输。

几年前我写过关于设计模式的文章。构建器模式是我描述的模式之一,这是该页面的链接: http://www.loekbergman.nl/InsideArchitecture/TheProcess/DesignPatterns/Builder 它显示了模式的UML图。 在下一个链接中,您可以下载一个带有一些设计模式示例的jar。其中一个是构建器模式: http://www.loekbergman.nl/InsideArchitecture/DownloadsAndLicense 我几年前写过这段代码,因此我没有保修就给你这个代码。 (在这种情况下,这是正确的术语吗?) 在代码中,您可以看到名称为specifications的文件夹。这是解释器模式的另一个例子。 (在Builder模式中,当然也有这种模式的一个例子)。

要完成,这里是MVC模式的链接: http://www.loekbergman.nl/InsideArchitecture/TheProcess/DesignPatterns/Observer 和解释器模式: http://www.loekbergman.nl/InsideArchitecture/TheProcess/DesignPatterns/Interpreter