适配器模式如何帮助实现 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 的对象并实现另一个系统的 interface
(Adaptee
和 interface
都在-相互兼容)。它使用委托来调用 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" 这个词在这里有些误用。虽然适配器模式有点相似。
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 的对象并实现另一个系统的 interface
(Adaptee
和 interface
都在-相互兼容)。它使用委托来调用 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" 这个词在这里有些误用。虽然适配器模式有点相似。