知识卡片

前端控制器的command调度权衡,与装饰器插入横切关注点

普通读书笔记卡

内容

前端控制器用一个统一的Web处理程序接住站点的所有请求,从URL提取信息后委托给具体的command对象去执行对应的动作——处理程序本身通常极简,除了决定该跑哪个command几乎不做任何事,而且不需要一点Web环境的知识,也不产生任何回应消息(这部分由command负责)。决定运行哪个command有静态和动态两条路:静态方法直接解析URL、用条件逻辑分发,好处是逻辑清晰、调度阶段能享受编译期错误检查、解析URL时也更灵活;动态方法则是提取URL里某个标准部分、动态实例化对应的command类(或者用属性文件把command类名和URL绑定起来),好处是新增command完全不用碰处理程序本身。前端控制器还有一个格外好用的搭配模式——截取筛选器:本质是一层装饰器,把前端控制器的处理程序包装起来,可以像链条一样叠加多个筛选器去处理认证、日志记录、字符编码这类横切关注点;由于整个站点只有这一个控制器入口,用装饰器模式在这里插入行为特别顺手,甚至可以通过配置文件在服务器运行期间动态增删这些筛选器,不需要改动处理程序本身。另外,因为每个请求都会各自创建一个新的command对象,天然规避了多线程共享状态的麻烦(前提是不要让command共享其他对象,比如模型对象)。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第14章 Web表现模式"之"14.3 前端控制器"(源文件:_epub-src/OEBPS/Text/000162.html、000163.html) - 结论依据:原文说明"静态方法的好处有以下三点:简明清晰的逻辑;在调度时可以执行编译时错误检查;在分析URL的时候可以拥有更多的灵活性。动态方法的好处是允许你在不改动Web处理程序的情况下增加新的command……对于前端控制器来说,一个非常有用的模式是截取筛选器……这是一个装饰,用来对前端控制器的处理程序进行包装。它允许你建立一条筛选器链(或者筛选器管道)去处理诸如认证、登录、现场识别的问题",直接支撑本卡结论。 - 原始内容:这里仅仅只有一个控制器,所以可以用装饰模式很容易地在程序运行时增加它的动作。可以把decorator用于认证、字符编码、国际化等,可以使用配置文件增加它们,甚至是在服务器正在运行的时候增加它们。