适配器模式如何帮助实现 Demeter 法则

How Adapter Pattern help in implementing Law Of Demeter

Law of Demeter (LOD) 不鼓励长链调用。它说只对直接在 class 内组成的对象或在方法内创建的对象调用方法,对象作为方法中的参数传递。如果 B b; 是 class A 中的一个字段并且 B 有一个类型为 C 的字段,(C c;) 那么在 A.java, 调用 b.c.performOperation();.

不是好的做法

根据我的理解,我们应该在每个 class 中使用小方法在它们内部的字段上执行操作,而不是让外部世界提取字段并调用方法。我也知道我们可以使用 Visitor pattern 来实现这一点。但后来我读到 Adapter is also one way to implement this,我无法理解。

Adapter 中只包含 Adaptee class 的对象并实现另一个系统的 interfaceAdapteeinterface 都在-相互兼容)。它使用委托来调用 Adaptee 上的方法。这里 LOD 并没有违反 seam 但我看不出如果我们没有使用 Adapter 模式那么法律是如何被违反的?

我引用的参考来自网站:http://c2.com/cgi/wiki/LawOfDemeter?LawOfDemeter

ObjectQueries? and the AdapterPattern are two ways to implement the LawOfDemeter. -- DaveOrme

这就是我认为他们的意思:

当他们谈论使用适配器模式来符合得墨忒尔定律时,他们谈论的是另一种情况,而不是您描述的标准适配器模式用例。

假设我们有一个 class,别人写的,它公开了一个 public 字段:

public class DataClass {
    public Data data;
}

当我们想要访问代码中任何地方的数据字段时,我们得到调用链:

dataClass.data.doOperation()

一个适配器可以用于'hide'这个调用链:

public class DataClassAdapter {
    DataClass wrappedInstance;

    public void doOperation() {
        wrappedInstance.data.doOperation();
    }
}

然后我们可以这样调用:

dataAdapter.doOperation();

没有调用链。

我认为 "Adapter" 这个词在这里有些误用。虽然适配器模式有点相似。