首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定正确行为的战略模式或责任链模式

确定正确行为的战略模式或责任链模式
EN

Stack Overflow用户
提问于 2013-12-03 09:04:12
回答 2查看 851关注 0票数 1

我有下面的UML图。CurlRequestHandlerKernelRequestHandler都是RequestHandlerInterface的实现。请求处理程序负责处理某个Request对象,它们都将返回相同的 Response对象。

代码语言:javascript
复制
   +------------------------+               +-------------------------+
   | CurlRequestHandler     |               | KernelRequestHandler    |
   |------------------------|               |-------------------------|
   |                        |               |                         |
   | - handleRequest(Request)               | - handleRequest(Request)|
   |                        |               |                         |
   |                        |               |                         |
   |                        |               |                         |
   +------------------------+               +-------------------------+
             +
             |                                             +
             |                                             |
             |        +---------------------------+        |
             |        | RequestHandlerInterface   |        |              +---------------+
             +---->   |---------------------------|  <-----+              |               |
                      |                           |                       |               |
                      | - handleRequest(Request)  |                       |    CLIENT     |
                      |                           |                       |               |
                      |                           |                       +---------------+
                      |                           |
                      |                           |
                      +---------------------------+

现在,为了确定我需要使用哪个处理程序,我的client中有下面的if语句

代码语言:javascript
复制
if ($mode == "kernel") {
    $handler = new KernelRequestHandler();
} else {
    $handler = new CurlRequestHandler();
}

$response = $handler->handleRequest($request);

现在,问题是,当我需要添加一个新的处理程序时,我需要修改if语句。我研究了Chain of Responsibility设计模式,这似乎做得更好,但我不确定。

哪种设计模式是最好的方法?

斯特芬

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-03 09:13:30

您需要的是实现一个工厂方法设计模式来创建处理程序。

代码语言:javascript
复制
class HandlerFactory {

    public function make($mode) {

        switch(strtolower($mode)) {

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

    }

}

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

PS:为什么你不应该叫你的类‘处理程序’

票数 4
EN

Stack Overflow用户

发布于 2013-12-03 09:18:36

代码语言:javascript
复制
class RequestFactory {
    public static function getHandler($mode) {
        $className = ucfirst($mode).'RequestHandler';
        return new $className();
    }
}

你可以这样使用它:

代码语言:javascript
复制
$handler = RequestFactory::getHandler('kernel');
$handler->handleRequest($request);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20346816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档