我有以下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
设计模式,这似乎做得更好,但我不确定。
哪种设计模式最适合这种方式?
斯特芬
答案 0 :(得分:4)
您需要实现工厂方法设计模式以创建处理程序。
class HandlerFactory {
public function make($mode) {
switch(strtolower($mode)) {
case 'kernel': return new KernelRequestHandler();
case 'curl': return new CurlRequestHandler();
}
}
}
而且,是的,您需要为每个新处理程序添加一个案例。
答案 1 :(得分:1)
如果你的$ mode等于你的RequestHandler类的开头,那你就可以追加它。
$mode = 'kernel';
$class = ucfirst($mode).'RequestHandler';
$handler = new $class;
将产生new KernelRequestHandler
答案 2 :(得分:0)
class RequestFactory {
public static function getHandler($mode) {
$className = ucfirst($mode).'RequestHandler';
return new $className();
}
}
你可以像这样使用它:
$handler = RequestFactory::getHandler('kernel');
$handler->handleRequest($request);