路由器是门面模式吗?

时间:2015-03-09 18:55:36

标签: php oop design-patterns solid-principles facade

我有这个路由器类,但我不确定它应该属于哪种模式。它似乎是facade或中介模式。你觉得怎么样?

class Router 
{
...
}

用法,

$router = new Router();

$router->get('/', function() { ... });
$router->get('foo/', function() { ... });
$router->post('foo/', function() { ... });

但是,似乎有人说路由器是一种反模式,因为在这个question中有一些表示。如果路由器违反了模式,那么解决方案是什么?

1 个答案:

答案 0 :(得分:1)

路由器本身不是一个模式,它只是一个工具,它只是将URI字符串与已知的 reg-ex模式相匹配。一旦找到匹配,则控制器的实例化需要由另一个工具处理,该工具称为 Dispatcher 。所以责任之间有一个清晰的分离,因此坚持单一责任原则

路由器本身不违反任何已知模式。只有在编写路由器类时才可能违反它们。

要启动您的应用程序,您还需要实现Front Controller,Dispatcher和PSR-0类自动加载器之类的东西。

至于外观,你的路由器实现与它无关。因为外墙不适合这样的事情。泰勒称外墙类提供服务,它不是外观模式实现。

外观本身只是一个包装器,它必须有一个适用于不同环境的接口。例如,JavaScript中一个非常流行的Facade实现示例

function click(elem, event, callback){
  if (elem.addEventListener != undefined){
     return elem.addEventListener(..);
  } else if (elem.attachEvent != undefined) {
     return elem.attachEvent(..);
  } else {
     return elem.onclick = callback;
  }
}

或许这可能是这样的:

// For old PHP versions
if (!function_exists('file_get_contents')){
  function file_get_contents(){
    // ...
  }
}

这就是外观的全部内容。

最后回答你的问题, 我会说,如果您不知道路由器应该如何工作,您应该停止考虑如何编写完美的代码。你最好开始编写有效的东西,然后开始思考它的改进。因此,您可能会获得良好且有效的代码。