我确信这是OOP中的经典案例,大多数程序员的答案都很简单,但我似乎没有在任何地方找到解释。 假设我有一个属于在类B中实例化的类A的方法,如下面的代码所示:
class A
{
public void foo() {/*do something*/}
}
class B
{
public A objectA;
public B()
{
objectA = new A();
}
public void call()
{
objectA.foo();
}
}
现在假设我有一个实例化B类的第三个C(它依次使用上面的代码实例化A类):
class C
{
public C()
{
objectB = new B();
}
}
从C类调用函数foo()的最佳方法是什么(如果有的话):
objectB.call();
或者
objectB.objectA.foo();
我认为第一个选项在模块性方面可能是正确的答案,但如果B类永远不必调用foo(),它似乎是多余的。 这里有一个好的答案还是整个模式本身存在缺陷?如果是的话,它违反了哪些设计原则以及解决方法是什么?
答案 0 :(得分:1)
在大多数情况下,objectA
首先不应公开。考虑到它是B类的状态,我会说只有B及其子类应该能够直接使用它,所以我更喜欢第一个选项。
但是,如果它确实是公开的,那么它意味着外部类被认为具有足够的信息来直接操作它,或者它们可以在不改变B实例状态的情况下执行它。在那种必须罕见的情况下,第二种选择就可以了。
答案 1 :(得分:0)
如果objectA是真正公开的,那么任何一个都是可以接受的。 objectA受保护更为常见,而C
则无法使用答案 2 :(得分:0)
根据Law of Demeter:“每个单位应该只与其朋友交谈;不要与陌生人交谈”,或者用另一种表述,“只与你的直接朋友交谈”。因此,上述第二种选择严格违反了这一原则。
话虽这么说,我觉得有必要在中间类中填充多个访问器方法,其唯一目的就是看远处的类并不是设计好的标志。