【问题标题】:Can someone explain how javax.servlet.http.HttpServlet methods like service(),doGet() and doPost() can be based on strategy pattern?有人可以解释一下 javax.servlet.http.HttpServlet 方法如 service()、doGet() 和 doPost() 如何基于策略模式?
【发布时间】:2020-08-09 17:06:36
【问题描述】:

我在某处读到 javax.servlet.http.HttpServlet: service() 方法,以及所有接受 HttpServletRequest 和 HttpServletResponse 对象作为参数的 doXXX() 方法。基于策略模式。我不清楚这一点。如果有人能帮忙就好了?

【问题讨论】:

标签: java oop design-patterns design-principles


【解决方案1】:

这是指service的默认实现将检查HTTP方法(HttpServletRequest对象的属性),然后将调用适当的doX方法,默认情况下返回一些'未实现的 HTTP 错误(doHead 除外,如果我没记错的话,它会调用 doGet)。

“战略模式”等术语没有固定的定义。您是否认为这是“策略模式”的一个很好的例子,取决于定义这个词的人。比如说,这不像 java 中“public”这个词的含义(那里有 一个指令:它的含义正是 Java 语言规范所说的。不多也不少。我的观点是,对于诸如“策略模式”之类的东西没有这样的规范。

servlet 的 API 非常糟糕,我绝对不会尝试将其用作应该制作 API 的某种示例。我会看看泽西岛之类的东西。

【讨论】:

  • 策略模式的规范在Gang of Four book中。
  • 那将是“四人组策略模式”。就像 python 的“for”和 java 的“for”有不同的含义,但都使用相同的词,你需要指定它。我还没有(还)看到 GoF 对该术语有合法要求的法令。
  • 我想所有术语的含义都值得商榷。 Urban Dictionary 中对 HTTP 和 API 的某些定义将极大地改变这个答案的含义。未来的读者是否需要法律引用才能理解这个答案?
  • 如果整个社区几乎完全同意“策略模式”的含义,那么无论如何,让我们使用 GoF 的确切定义。我想说的是,对于“HTTP”这个术语,绝大多数社区同意;为了清楚起见,无需链接到 RFC。
【解决方案2】:

根据 Wikipedia,策略模式 (https://en.wikipedia.org/wiki/Strategy_pattern) “允许在运行时选择算法”。

因此,如果您查看过滤器 (https://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html),它们会实现一个 doFilter 方法,该方法将是“算法”。可以有 ACL 过滤器、命中计数器过滤器、GZIP 过滤器等...

过滤器在运行时根据请求参数和服务器配置应用,所以我猜你可以说这是策略模式的一个例子。

【讨论】:

    【解决方案3】:

    基于策略模式的 GoF 定义,这是一个不好的例子。策略对象不是调用它的方法的方法参数。策略模式是基于组合的,HttpServlet中显然没有组合关系。

    此外,HttpServletRequestHttpServletResponse 参数不是“算法家族”。它们是数据载体。

    最后,HttpServlet 不是“子类化的替代方案”。它是一个抽象类,所以它是专门为继承而设计的。

    Examples of GoF Design Patterns in Java's core libraries 中重复了这个糟糕的例子。不幸的是,关于设计模式的错误信息是在线rampant

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 2012-02-27
      • 2013-06-29
      • 2011-08-18
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      相关资源
      最近更新 更多