2014-01-30 265 views

回答

3

当策略类具有上下文知识时,或者当客户意识到策略具体类时,策略是耦合的。

我们可以读到here(有一些小修改):

通常每个策略从上下文需要的数据还是有一些处理的数据返回上下文。这可以通过两种方式来实现。

  1. 创建一些额外的类来封装特定的数据。
  2. 将上下文对象本身传递给策略对象。策略对象可以直接在上下文中设置返回的数据。

当应该传递数据时,应该分析每种方法的缺点。例如,如果创建了一些类来封装其他数据,则应特别注意类中包含哪些字段 。也许在当前的实现中,所有的 必填字段都会被添加,但是将来可能会有一些新的策略 具体类需要来自上下文的数据,这些数据不包含在 附加的类中。另一个事实应该在此指定: 很有可能某些策略具体类不会使用 在附加类中传递给它的字段。

如果上下文对象被传递给策略,那么我们在策略和上下文之间有一个耦合。

关于战略和客户端之间的耦合,在同一页中,我们读到:

在经典的实现模式的客户端应该 意识到战略的具体类。为了将 客户端类与策略类分离,可以使用上下文对象内的工厂类 来创建要使用的策略对象。通过 这样做,客户端只需发送参数(如字符串)到 上下文要求使用特定算法,完全是 策略类的解耦。

不管上下文是谁决定的策略,去耦是由注射的具体战略目标,以客户端,因此客户端不知道它是具体的实施,还是什么其他的实现也有。

因此,一个解耦的实现是没有人知道其他具体参与者的地方。