好吧所以我试图弄清楚所有这些模式。
好吧,所以我在CodeIgniter中编写了一个应用程序,它需要能够使用SOAP,可能是XML,逗号分隔等将有关汽车和客户的数据发送给不同类型的公司。
但他们都需要同样的事情。
我想让它尽可能地动态,并确保编写测试很容易。
所以服务应该采取一些措施:
我开始创建不同的类
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();
有什么建议吗?
答案 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