什么应该有HandlerInterceptorAdaptor被调用?

时间:2012-07-08 07:19:14

标签: spring design-patterns naming-conventions naming

在Spring MVC中,可以定义可以在调用特定控制器之前和之后执行工作的拦截器。例如,这可用于执行日志记录,身份验证等。

希望编写自定义拦截器的程序员应该实现HandlerInterceptor接口。为了帮助完成此任务,提供了HandlerInterceptorAdaptor抽象基类,它提供了接口中指定的所有方法的默认实现。因此,如果只想进行一些预处理,可以extend HandlerInterceptorAdaptor@Override public boolean preHandle(...),而不必担心实施postHandle功能。

我怀疑这个名字。根据我对适配器模式的理解,它适应了接口之间的语法阻抗不匹配。

  1. 是这样吗?如果是,那么提供样板实现的类应该被称为HandlerInterceptorDefaultImpl,还是那些沿着这些线的东西?

  2. 这里发生的事情是否有不同的命名/模式?

  3. 事实上我们需要一个样板代码的样板气味,并且可以通过将HandlerInterceptor接口重构为两个来删除:HandlerPreInterceptor和HandlerPostInterceptor?或者这有点矫枉过正?

1 个答案:

答案 0 :(得分:1)

关于适配器模式的GOF书:

适配器在使Adaptee适应目标接口方面所做的工作量各不相同。从简单的界面转换(例如,更改操作名称)到支持完全不同的操作集,有一系列可能的工作。适配器的工作量取决于Target接口与Adaptee的相似程度。

您引用的样板类称为骨架实现类。约书亚布洛赫在Effective Java中提到了这一点。从书中可以看出:

您可以通过提供抽象骨架实现类来组合接口和抽象类的优点,以与您导出的每个非平凡接口一起使用。接口仍然定义了类型,但是骨架实现完成了实现它的所有工作。

按照惯例,骨架实现称为AbstractInterface,其中Interface是它们实现的接口的名称。例如,Collections Framework提供了一个骨架实现,以与每个主集合接口一起使用:AbstractCollection,AbstractSet,AbstractList和 AbstractMap。可以说,将它们称为SkeletalCollection,SkeletalSet,SkeletalList和SkeletalMap是有意义的,但现在已经确立了抽象惯例。