我有这个路由器类,但我不确定它应该属于哪种模式。它似乎是facade或中介模式。你觉得怎么样?
class Router
{
...
}
用法,
$router = new Router();
$router->get('/', function() { ... });
$router->get('foo/', function() { ... });
$router->post('foo/', function() { ... });
但是,似乎有人说路由器是一种反模式,因为在这个question中有一些表示。如果路由器违反了模式,那么解决方案是什么?
答案 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(){
// ...
}
}
这就是外观的全部内容。
最后回答你的问题, 我会说,如果您不知道路由器应该如何工作,您应该停止考虑如何编写完美的代码。你最好开始编写有效的东西,然后开始思考它的改进。因此,您可能会获得良好且有效的代码。