0

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

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

我的疑问与名称有关。根据我对适配器模式的理解,它适应接口之间的句法阻抗不匹配。

  1. 是这样吗?如果是,那么提供样板实现的类是否应该称为 HandlerInterceptorDefaultImpl,或者类似的名称?

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

  3. 我们需要样板类的事实是否是代码异味,并且可以通过将 HandlerInterceptor 接口重构为两个:HandlerPreInterceptor 和 HandlerPostInterceptor 来消除?还是那是矫枉过正?

4

1 回答 1

1

来自 GOF 关于适配器模式的书:

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

您所指的样板类称为骨架实现类。Joshua Bloch 在 Effective Java 中提到了这一点。从书中:

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

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

于 2012-07-08T08:07:16.957 回答