原文地址:https://blog.csdn.net/qq_24499615/article/details/77821896
在項目的開發過程中,我們經常強調項目的代碼模塊儘量做到低耦合高內聚,但是什麼是耦合?怎樣做到低耦合?可能有很多人感到疑惑,下面我來跟大家講解什麼是耦合,怎麼進行解耦合實現低耦合。
一、什麼是耦合?
耦合指的就是兩個類之間的聯繫的緊密程度,看下面這段代碼:
public class A{
public int i;
}
public class B{
public void put(A a){
System.out.println(a.i);
}
}
上面這個例子中A類和B類之間存在一種強耦合關係,B類的put方法參數必須是A類類型,不可以是非A類類型。有強耦合關係當然也存在所謂的弱耦合關係,請看下面這段代碼:
public interface IBase{
void say();
}
public class A implements IBase{
@Override
public void say() {
System.out.println("I am A");
}
}
public class B implements IBase{
@Override
public void say() {
System.out.println("I am B");
}
}
public class C{
public void put(IBase base){
base.say();
}
}
上面這段代碼中C類與A類、B類之間就存在一種弱耦合關係,C類的put方法的參數可以使A類類型也可以是B類類型,不像強耦合關係中必須是A類類型其他類型皆不可的情形。
二、怎麼實現低耦合?
實現低耦合就是對兩類之間進行解耦,解除類之間的直接關係,將直接關係轉換成間接關係,下面來提供兩種解耦思路。
1、使用類的向上轉型或接口回調的方式進行解耦
這兩個方式其實都是一種思想,都是利用多態的思想,上面的弱耦合樣例代碼是接口回調的方式,下面展示利用類向上轉型如何解耦:
public class Base{
public void say(){
System.out.println("I am Base");
}
}
public class A extends Base{
@Override
public void say() {
System.out.println("I am A");
}
}
public class B extends Base{
@Override
public void say() {
System.out.println("I am B");
}
}
public class C{
public void put(Base base){
base.say();
}
}
看到這段代碼是不是感覺跟上面的利用接口實現的弱耦合代碼很相似,他們都是利用繼承思想實現的多態性。
2、利用適配器模式進行解耦
所謂的強耦合不就是類之間存在着直接關係,從而使得他們倆聯繫特別緊密,那我在他們之間加一層,使直接關係變成間接關係,請看下面這段代碼:
public class A{
public void aSay() {
System.out.println("I am A");
}
}
public class Base{
public A a;
public Base(A a){
this.a=a;
}
public void baseSay(){
a.aSay();
}
}
public class B{
public void put(Base base){
base.baseSay();
}
}
public static void main(String[] args){
A a=new A();
Base base=new Base(a);
B b=new B();
b.put(base);
}
上面這段代碼就是適配器模式進行解耦的代碼例子,可能有人會很疑惑這樣解耦有什麼意義,以上代碼只做演示確實看不出這種解耦的好處,但是在實際的項目開發過程中,如果有關A類的一些需求發生改變,我們可能只需要修改Base中的相關代碼就可以進行整體需求的改變,否則的話,我們不僅要 修改A,還很有可能會導致B的修改。
解耦的本質就是將類之間的直接關係轉換成間接關係,不管是類向上轉型,接口回調還是適配器模式都是在類之間加了一層,將原來的直接關係變成間接關係,使得兩類對中間層是強耦合,兩類之間變成弱耦合關係。
以上純屬個人見解,如有不對歡迎各位大神指正。