我有下面的UML图。CurlRequestHandler和KernelRequestHandler都是RequestHandlerInterface的实现。请求处理程序负责处理某个Request对象,它们都将返回相同的 Response对象。
+------------------------+ +-------------------------+
| CurlRequestHandler | | KernelRequestHandler |
|------------------------| |-------------------------|
| | | |
| - handleRequest(Request) | - handleRequest(Request)|
| | | |
| | | |
| | | |
+------------------------+ +-------------------------+
+
| +
| |
| +---------------------------+ |
| | RequestHandlerInterface | | +---------------+
+----> |---------------------------| <-----+ | |
| | | |
| - handleRequest(Request) | | CLIENT |
| | | |
| | +---------------+
| |
| |
+---------------------------+现在,为了确定我需要使用哪个处理程序,我的client中有下面的if语句
if ($mode == "kernel") {
$handler = new KernelRequestHandler();
} else {
$handler = new CurlRequestHandler();
}
$response = $handler->handleRequest($request);现在,问题是,当我需要添加一个新的处理程序时,我需要修改if语句。我研究了Chain of Responsibility设计模式,这似乎做得更好,但我不确定。
哪种设计模式是最好的方法?
斯特芬
发布于 2013-12-03 09:13:30
您需要的是实现一个工厂方法设计模式来创建处理程序。
class HandlerFactory {
public function make($mode) {
switch(strtolower($mode)) {
case 'kernel': return new KernelRequestHandler();
case 'curl': return new CurlRequestHandler();
}
}
}而且,是的,您需要为每个新的处理程序添加一个案例。
PS:为什么你不应该叫你的类‘处理程序’
发布于 2013-12-03 09:18:36
class RequestFactory {
public static function getHandler($mode) {
$className = ucfirst($mode).'RequestHandler';
return new $className();
}
}你可以这样使用它:
$handler = RequestFactory::getHandler('kernel');
$handler->handleRequest($request);https://stackoverflow.com/questions/20346816
复制相似问题