天天看點

【180期】什麼是耦合?解耦合的方法有哪幾種?

在項目的開發過程中,我們經常強調項目的代碼子產品盡量做到低耦合高内聚,但是什麼是耦合?怎樣做到低耦合?可能有很多人感到疑惑,下面我來跟大家講解什麼是耦合,怎麼進行解耦合實作低耦合。

什麼是耦合?

耦合指的就是兩個類之間的聯系的緊密程度,看下面這段代碼:

  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的修改。