1

我已经看到了一个 CoR 模式的示例实现,它使用 HashMap 作为传递到链中的对象,可能会通过处理程序将新内容添加到其中;下面的代码大纲:

class HandlerImpl implements Handler {

     Handler next;

     void handle(HashMap context) {
         // do handler logic, perhaps adding new stuff to "context"
         if (next != null)
             next.handle();
     }
 }

使用它很诱人,因为处理程序可以使用新信息来增强这些context信息,这些信息可以被后续处理程序使用,而无需重复代码。另一方面,处理程序变得相互依赖——它们仍然是松散耦合的,但它们的顺序仍然变得越来越重要。

这段代码有味道吗?如果我们发现如果不使用新信息补充上下文对象就无法使用 CoR 模式,那么在这种情况下使用什么模式才是正确的呢?

4

2 回答 2

2

这取决于您的“处理程序”要做什么。一种替代方法是将其更改为“管道”,该“管道”声明它需要什么输入,以及它的输出将是什么。输出可能是相同的类型——可能是对输入对象的修改——或者它可能是某种转换。这种转变可以只是添加信息,或者做一些完全不同的事情。如果只需要添加信息,则可以使用组合很容易地完成。

这样,每个处理程序在它需要/产生的数据方面是紧密耦合的(并且是显式的) - 但就将产生使用该数据的内容而言,它是松散耦合的。

基本上,“最佳方法”将取决于:

  • 你想做什么
  • 您正在使用什么语言/平台(它有不可变的推力吗?它有静态类型和泛型吗?)
于 2011-11-05T09:09:08.360 回答
1

我不认为将上下文传递到链中是违反模式的。

servlet 过滤器通常用作 CoR 模式的示例,过滤器可以自由添加/删除共享请求对象的属性,甚至可以将请求包装在新对象中,以拦截后续过滤器或 servlet 执行的任何操作.

于 2011-11-05T09:13:15.017 回答