1. 程式人生 > >什麼是耦合?解耦合的方法有哪幾種?

什麼是耦合?解耦合的方法有哪幾種?

在專案的開發過程中,我們經常強調專案的程式碼模組儘量做到低耦合高內聚,但是什麼是耦合?怎樣做到低耦合?可能有很多人感到疑惑,下面我來跟大家講解什麼是耦合,怎麼進行解耦合實現低耦合。

一、什麼是耦合?

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

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

解耦的本質就是將類之間的直接關係轉換成間接關係,不管是類向上轉型,介面回撥還是介面卡模式都是在類之間加了一層,將原來的直接關係變成間接關係,使得兩類對中間層是強耦合,兩類之間變成弱耦合關係。

以上純屬個人見解,如有不對歡迎各位大神指正。

相關推薦

什麼是耦合耦合方法

在專案的開發過程中,我們經常強調專案的程式碼模組儘量做到低耦合高內聚,但是什麼是耦合?怎樣做到低耦合?可能有很多人感到疑惑,下面我來跟大家講解什麼是耦合,怎麼進行解耦合實現低耦合。 一、什麼是耦合? 耦合指的就是兩個類之間的聯絡的緊密程度,看下面這段程式

大資料分析方法

科學技術的更新與網際網路的飛速發展,推動著大資料時代的來臨,每天各行各業都在產生數量無法預估的資料碎片。只有在合理的時間內擷取、管理、處理、整理這些龐大的資料庫,才能幫助企業獲得自己想要的資料,從而更好地提出經營管理對策。那麼資料分析有哪幾種方法?今天小編就為大家整理一下:

jQuery的$.ajax方法響應數據類型?本質上原生ajax響應數據格式,分別對應哪個屬性?

res 需要 scrip class 屬性 rip xhr tex post jQuery的$.ajax方法響應數據類型有:xml、html、script、json、jsonp、text 本質上原生ajax響應數據格式只有2種:xml和text,分別對應xhr.resp

java算法面試題:排序都方法?請列舉。用JAVA實現一個快速排序。選擇冒泡快速集合至少4方法排序

算法 err div println rda print 算法面試 ++ 快速排序 package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util

多執行緒同步和互斥實現方法

執行緒間的同步方法大體可分為兩類:使用者模式和核心模式。顧名思義,核心模式就是指利用系統核心物件的單一性來進行同步,使用時需要切換核心態與使用者態,而使用者模式就是不需要切換到核心態,只在使用者態完成操作。使用者模式下的方法有:原子操作(例如一個單一的全域性變數),臨界區。核

保證類不會被擴充套件,方法

第一:把類設計成final型別public final class StringBuilder{}第二:把構造器的域為private,提供靜態工廠方法。public class AA{ private AA(){}

C++多態方式?

cti 早綁定 時間 對象 區別 父類 不同的 版本 內幕 C++多態方式: (1)靜態多態(重載,模板) 是在編譯的時候,就確定調用函數的類型。 (2)動態多態(覆蓋,虛函數實現) 在運行的時候,才確定調用的是哪個函數,動態綁定。運行基類指針指向派生類的對象,並調用派生類

數據庫的隔離級別

可能 這就是 otto fff 行數 範圍 執行 分別是 div  1.READ UNCIMMITTED(未提交讀)  事務中的修改,即使沒有提交,其他事務也可以看得到,比如說上面的兩步這種現象就叫做臟讀,這種隔離級別會引起很多問題,如無必要,不要隨便使用  例子:還是售票

交易所系統模式?交易系統開發,imToken錢包開發

易信 完成後 操作 愛好 數字 比例 線下 借貸 風險 交易所系統有哪幾種模式?交易系統開發,imToken錢包開發 交易系統有哪幾種模式? (1)OTC交易系統 OTC:是一套獨立於交易所外的線下購買數字資產的平臺,任何人都可以在該平臺上發布購買/出售廣告,購買/出售用戶

零基礎大資料學習必學技術,你知道嗎?

現在大資料非常火爆,不管是阿里巴巴、百度、騰訊這樣的大企業,還是中小型的企業都非常重視,大資料也是第一個納入國家戰略的技術。今天為大家講一下零基礎大資料學習必學技術有哪幾種。 大資料給大多數人的感覺是,專業性強,屬於“高大上”的技術。一部分人對大資料比較感興趣,會上網搜尋一些概念性的簡單瞭解,而

區塊鏈共識機制常見的

hello 大家好,今天繼續給大家區塊鏈知識。 1. PoW( Proof of Work)工作量證明機制——多勞多得 PoW機制中根據礦工的工作量來執行貨幣的分配和記賬權的確定。算力競爭的勝者將獲得相應區塊記賬權和比特幣獎勵。因此,礦機晶片的算力越高,挖礦的時間更長,就可以獲得更多的數字貨

vlan交換機的埠模式

一 埠型別1 ,Access使用者模式2 ,Trunk鏈路模式3 ,Hybrid模式(跟Trunk很類似但比trunk高階)二 埠介紹2.1 ,Access型別埠:只允許預設vlan的乙太網幀,也就是說只能屬於一個vlan,Access埠在收到乙太網幀後打上vlan標籤,轉發時在剝離vlan標籤,一般情況下一

零基礎大資料學習必學技術

現在大資料非常火爆,不管是阿里巴巴、百度、騰訊這樣的大企業,還是中小型的企業都非常重視,大資料也是第一個納入國家戰略的技術。今天為大家講一下零基礎大資料學習必學技術有哪幾種。 大資料給大多數人的感覺是,專業性強,屬於“高大上”的技術。一部分人對大資料比較感興趣,會上網搜尋一些概念性的簡單瞭解,而有一些人則看

零基礎大數據學習必學技術

入門教程 基礎學習 巴巴 編程 騰訊 人的 hbase 實時計算系統 基本 現在大數據非常火爆,不管是阿裏巴巴、百度、騰訊這樣的大企業,還是中小型的企業都非常重視,大數據也是第一個納入國家戰略的技術。今天為大家講一下零基礎大數據學習必學技術有哪幾種。 大數據給大多數人的感覺

關於執行緒池工作原理,任務拒接策略

 在ThreadPoolExecutor類中提供了四個構造方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class ThreadPoolExecutor extends 

JS傳參方式?

這裡是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【JS有哪幾種傳參方式?】 (1)背景介紹: js中的傳值方式,對於簡單型別(比如字串和

Unity你用過哪些設計模式?你熟悉的設計模式呢?

以前寫過幾篇設計模式的詳細解釋,今天在這裡不詳細介紹,有興趣瞭解的可以去看前幾篇隨筆,今天就簡單的介紹我們常用的設計模式. (1)工廠模式 簡單工廠模式解決的問題是如何去例項化一個合適的物件. 簡單工廠模式的核心思想就是:有一個專門的類來負責例項過程,正規化出現大量產品需要建立,並且具有共同的介面時,可

大資料視覺化應用工具,主要

  俗話說的好,逆水行舟,不進則退,在快速發展的今天,緊跟時代的步伐,抓住時代的脈搏,才能助力企業激流勇進,搶佔先機。作為助力企業經營決策的大資料視覺化應用,對於的企業發展起著至關重要的作用,但是如何利用大資料視覺化,如何做好大資料視覺化,今天小編就給大家介紹幾款實用的工具,幫助大家在大資料的海

MySQL----mysql的引擎,innodb Myisam 的區別?

2、mysql的引擎有哪幾種,innodb Myisam 的區別?     1) 儲存引擎主要有:     1. MyIsam ,     2. InnoDB,     3. Memory,     4. Blackhole,      5. CSV,      6. Pe

java 線程池,各什麽特點

nsq cache 使用 組成 work nbsp 接口 thread keepalive 一:newCacheThtreadPool,用於短時的線程,如果任務多余工作的線程,就會創建,空閑就會銷毀。內部使用syschrounsQueue隊列。 newFixThreadPo