传递对中产阶级的引用只是为了从第一类实例中获取一些数据

时间:2014-08-12 08:16:29

标签: java design-patterns

我如何绕过以下设计?

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实例的一些数据。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

以下是您的类图的样子:

Before

错误的是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();
    }
}

在此之后,您的类之间的依赖关系将如下所示:

enter image description here