//Ex1: (passing by object)
class A {
}
class B {
void foo(A a) {
<do something with a>
}
}
//Ex2: (composition)
class C {
A a
void foo(){
<do something with a>
}
}
我的问题是:哪种模式的耦合较低?在现实世界中哪种模式更受欢迎?
我将尝试解释松耦合。
- 接口中的程序,这使得使用在运行时实现相同接口的不同类型的对象的可能性,这里来自不同继承树的类可以实现相同的接口。
例如:
Animal is the Interface
Dog class implements Animal
Cat class implements Animal
Lion class implements Animal
/////////////////
calling method
/////////////////
callAnimal(new Dog);
/////////////////
called method
/////////////////
public void (Animal a){
// some code
}
封装不断变化的行为。到抽象类或接口中,因此当更改来临时会很容易,并且由于它是松散耦合的,因此代码中断的机会较小。
我会说两者都没有真正的较低耦合,它更依赖于实现。耦合最好的简单解释是,如果A类的属性发生变化,B类需要改变多少。在这种情况下,foo
的方法很可能必须在两种情况下进行相同的更改。
至于现实世界,这完全取决于情况。A类只用于B类吗?它是一个 Web 应用程序,您需要注入还是输出 A 类?A班会成为单身人士吗?什么将使用B类?每个班级到底做什么?!
总之,在你查看每个类的功能以及如何使用它们之前,你不能以任何一种方式进行论证(这就是凝聚力的用武之地(。
恕我直言,首选第二个选项(组合(,因为:
-
呼叫者不需要知道
A
-
B
可以自由更改其实现以使用A
以外的类来完成其工作(不影响/重新编译调用代码(
第一个选项(按对象传递(在调用方和A
之间创建更大的耦合(尽管B
无论哪种方式都是耦合的(。