Law of Demeter
(LOD)不鼓励长长的呼唤。它表示只调用直接在类中组成的对象的方法,或者在方法内创建的对象,在方法中作为参数传递的对象。如果B b;
是班级A
中的字段且B
的字段类型为C
,(C c;
),则A.java
内,{}致电b.c.performOperation();
的好习惯。
根据我的理解,我们应该在每个类中使用小方法对其中的字段进行操作,而不是外部世界提取字段并调用方法。我也理解我们可以使用Visitor pattern
来实现这一目标。但后来我读了Adapter也是实现这个的一种方法,我无法理解。
适配器只包含Adaptee
类的对象,并实现另一个系统的interface
(Adaptee
和interface
彼此兼容)。它使用委托来调用Adaptee
上的方法。这里LOD
不会被违反,但我不知道我们是否会使用适配器模式然后法律如何被破坏?
我从中获取的引用来自网站:http://c2.com/cgi/wiki/LawOfDemeter?LawOfDemeter
ObjectQueries?和AdapterPattern是实现的两种方法 LawOfDemeter。 - DaveOrme
答案 0 :(得分:1)
这就是我认为的意思:
当他们谈论使用适配器模式符合Demeter定律时,他们谈论的是另一种情况而不是您描述的标准适配器模式用例。
假设我们有一个类,其他人写的,暴露了一个公共领域:
public class DataClass {
public Data data;
}
当我们想要访问代码中的任何地方的数据字段时,我们会得到调用链:
dataClass.data.doOperation()
适配器可用于“隐藏”此调用链:
public class DataClassAdapter {
DataClass wrappedInstance;
public void doOperation() {
wrappedInstance.data.doOperation();
}
}
然后我们可以这样打电话:
dataAdapter.doOperation();
没有通话链。
我认为“Adapter”这个词在这里有点滥用。尽管适配器模式有些类似。