我如何绕过以下设计?
package com.example;
public class A {
public String[] data;
public B doFooB() {
return new B(this);
}
public String[] getWhatINeed() {
return data;
}
}
class B {
public A a;
public B(A a) {
this.a = a;
}
public C doFooC(A a) {
return new C(a);
}
}
class C {
public A a;
public C(A a) {
this.a = a;
}
public String[] doFooC() {
return a.getWhatINeed();
}
}
我不喜欢这种方法,因为引用类A的实例首先通过类B传递到类C,在那里我只需要来自类A实例的一些数据。
提前感谢您的帮助!
答案 0 :(得分:2)
以下是您的类图的样子:
错误的是C类直接使用A类来检索data
。它违反了一种称为Law of Demeter的编程良好实践,其中指出:
每个单位只应与其朋友交谈;不要和陌生人说话。
因此,应该使用B类作为代理来绕过这种依赖。我们将在B类中创建方法getWhatINeed()
,它将此调用委托给A类。以下是您的代码的样子:
public class A {
public String[] data;
public B doFooB() {
return new B(this);
}
public String[] getWhatINeed() {
return data;
}
}
class B {
public A a;
public B(A a) {
this.a = a;
}
public getWhatINeed() {
return a.getWhatINeed();
}
public C doFooC() {
return new C(this);
}
}
class C {
public B b;
public C(B b) {
this.b = b;
}
public String[] doFooC() {
return b.getWhatINeed();
}
}
在此之后,您的类之间的依赖关系将如下所示: