Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 适配器模式如何帮助实施德米特定律_Java_Oop_Design Patterns_Law Of Demeter - Fatal编程技术网

Java 适配器模式如何帮助实施德米特定律

Java 适配器模式如何帮助实施德米特定律,java,oop,design-patterns,law-of-demeter,Java,Oop,Design Patterns,Law Of Demeter,德米特定律(LOD)不鼓励长时间的呼叫。它说只对类中直接组成的对象或在方法中创建的对象调用方法,这些对象在方法中作为参数传递。如果B是类a中的一个字段,B有一个类型为C,(C;)的字段,然后在a.java中调用B.C.performOperation()不是一个好的做法 根据我的理解,每个类中都应该有一些小方法,对它们内部的字段执行操作,而不是外部世界提取字段并调用方法。我也知道我们可以使用访客模式来实现这一点。但后来我读到适配器也是实现这一点的一种方法,我不理解 适配器只是在其中包含Adapt

德米特定律(LOD)不鼓励长时间的呼叫。它说只对类中直接组成的对象或在方法中创建的对象调用方法,这些对象在方法中作为参数传递。如果
B
是类
a
中的一个字段,
B
有一个类型为
C
,(
C;
)的字段,然后在
a.java
中调用
B.C.performOperation()不是一个好的做法

根据我的理解,每个类中都应该有一些小方法,对它们内部的字段执行操作,而不是外部世界提取字段并调用方法。我也知道我们可以使用
访客模式
来实现这一点。但后来我读到适配器也是实现这一点的一种方法,我不理解

适配器只是在其中包含
Adaptee
类的对象,并实现另一个系统的
接口
Adaptee
接口
彼此兼容)。它使用委托来调用
Adaptee
上的方法。这里的
LOD
没有被违反,但我看不出我们是否会使用适配器模式,那么法律是如何被违反的

我的参考资料来自以下网站:

对象查询?AdapterPattern和AdapterPattern是实现 德米特定律达维奥姆


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

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

假设我们有一个其他人编写的类,它公开了一个公共字段:

public class DataClass {
    public Data data;
}
当我们想要访问代码中任何位置的数据字段时,我们会得到调用链:

dataClass.data.doOperation()
适配器可用于“隐藏”此呼叫链:

public class DataClassAdapter {
    DataClass wrappedInstance;

    public void doOperation() {
        wrappedInstance.data.doOperation();
    }
}
然后我们可以这样称呼:

dataAdapter.doOperation();
没有呼叫链


我认为“适配器”这个词在这里有些误用。尽管适配器模式有些相似。

扩展您所写的内容:适配器模式的解释比较松散。包装器方法是不考虑LoD的代码的解决方案。对象适配器可以看作是包装器,因为它们将一个公共方法转换为其他一系列封装方法。立面也可以做同样的事情,因为它只是授权(或间接)。但是,如果考虑GOF适配器模式,那么对象适配器不是不尊重LoD的代码的解决方案。