用于确定正确行动的战略模式或责任链模式

时间:2013-12-03 09:04:12

标签: php oop design-patterns strategy-pattern

我有以下UML图。 CurlRequestHandlerKernelRequestHandler都是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设计模式,这似乎做得更好,但我不确定。

哪种设计模式最适合这种方式?

斯特芬

3 个答案:

答案 0 :(得分:4)

您需要实现工厂方法设计模式以创建处理程序。

class HandlerFactory {

    public function make($mode) {

        switch(strtolower($mode)) {

            case 'kernel': return new KernelRequestHandler();
            case 'curl': return new CurlRequestHandler();
        }

    }

}

而且,是的,您需要为每个新处理程序添加一个案例。

PS:Why you shouldn't call your classes 'handler'

答案 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);