亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java 你知道什么是耦合、如何解(降低)耦合

 更新時間:2021年09月06日 08:43:40   作者:怪咖軟妹@  
這篇文章主要介紹了Java 你知道什么是耦合、如何解(降低)耦合的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

什么是耦合性

耦合性(Coupling),也叫耦合度,是對模塊間關(guān)聯(lián)程度的度量。模塊間的耦合度是指模塊之間的依賴關(guān)系,包括控制關(guān)系、調(diào)用關(guān)系、數(shù)據(jù)傳遞關(guān)系。模塊間聯(lián)系越多,其耦合性越強,同時表明其獨立性越差( 降低耦合性,可以提高其獨立性)。

什么是程序間的耦合

假如:當我去new一個對象的時候,而這個對象不存在,這個時候程序會報編譯時異常,也就意味著程序連運行都運行不了,我們可以理解為他們的耦合度較高。

如何解耦

我們可以利用Java的反射技術(shù),通過類定名,來進行反射創(chuàng)建對象,這個時候我們可以成功的避免編譯時異常,并且保證了項目在這個時候還能正常運行。

工廠模式解耦

在實際開發(fā)中我們可以把三層的對象都使用配置文件配置起來,當啟動服務(wù)器應(yīng)用加載的時候,讓一個類中的方法通過讀取配置文件,把這些對象創(chuàng)建出來并存起來。在接下來的使用的時候,直接拿過來用就好了。那么,這個讀取配置文件,創(chuàng)建和獲取三層對象的類就是工廠。

案例

早期我們的 JDBC 操作,注冊驅(qū)動時,我們?yōu)槭裁床皇褂?DriverManager 的 register 方法,而是采用 Class.forName 的方式?

public class JdbcDemo1 {
 public static void main(String[] args) throws Exception {
 //1.注冊驅(qū)動
 //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
 Class.forName("com.mysql.jdbc.Driver");
 //2.獲取連接
 //3.獲取預(yù)處理 sql 語句對象
 //4.獲取結(jié)果集
 //5.遍歷結(jié)果集
 }
}

原因就是:

我們的類依賴了數(shù)據(jù)庫的具體驅(qū)動類(MySQL),如果這時候更換了數(shù)據(jù)庫品牌(比如 Oracle),需要修改源碼來重新數(shù)據(jù)庫驅(qū)動。這顯然不是我們想要的。

解決思路:

當是我們講解 jdbc 時,是通過反射來注冊驅(qū)動的,代碼如下:

Class.forName("com.mysql.jdbc.Driver");//此處只是一個字符串

此時的好處是,我們的類中不再依賴具體的驅(qū)動類,此時就算刪除 mysql 的驅(qū)動 jar 包,依然可以編譯(運行就不要想了,沒有驅(qū)動不可能運行成功的)。同時,也產(chǎn)生了一個新的問題,mysql 驅(qū)動的全限定類名字符串是在 java 類中寫死的,一旦要改還是要修改源碼。解決這個問題也很簡單,使用配置文件配置。

以上只是說的解耦的一種思維,方便大家理解。

解耦的核心思想:若要減少代碼的耦合度,一定要盡量做到各個功能的代碼不能交叉編寫,編寫封閉的代碼。

解耦合

廣大程序猿同胞,經(jīng)常會看到“解耦合”,也有很多人,會用這個詞來裝X,但是,實際真正能理解的人,并不多。接下來,帶大家深入淺出的走一遍,如何解耦合。

首先,我們要知道,為什么要解耦合:通常,我們做一個項目,會用到很多基礎(chǔ)功能塊,比如xxx通信協(xié)議,xxxView等等,我們會把這種功能塊封裝成一個庫,如果這個庫,只能在這個指定的項目運行,這就叫高耦合,這就導致了,如果下次再次遇到一個類似的項目,需要用到同樣功能的功能塊時,你會要做很多重復工作。假設(shè),每次使用json時,你都要對json庫進行改造,那將會是一個晴天霹靂。

但是,事與愿違,有些情況,還真的不太好解耦。

這里,我們先舉個栗子,比如排序

一個排序功能,對于大部分比較初級的程序猿來說,可能會寫成這樣:

sort(List<Integer> list)

這樣就導致了一個問題所在,這個方法只能排序int型數(shù)據(jù),如果下一個項目,需要用到對String進行排序,那就很尷尬,感覺明明要成功了,但是又差一點。對,就是差這一點,就是代碼解耦的關(guān)鍵。

我們先要明確,我們需要做的是排序功能,在這個過程中,我們不可避免的需要使用2個數(shù)據(jù)的大小對比,而這個數(shù)據(jù),可能是任何數(shù)據(jù),也就是說,排序算法,我們是可以確定下來,做成不動的庫,但是有一個數(shù)據(jù)大小匹配是我們無法做到的,或者說是庫的耦合點,那怎么辦呢?

我們就讓使用我們這個功能塊的人,告訴我們就行啦。

下面,我們參考Android庫里面,有個排序的api

Collections.sort(List<T> list, Comparator<? super T> c);

這里,Comparator這個接口,就是使用者,需要實現(xiàn),并且傳遞進去的接口。這樣做,這個排序功能塊就可以應(yīng)用在任何場合,達到一次開發(fā),受用終身的目的。是不是很神奇?

我們再舉個栗子,socket

我們在開發(fā)時,經(jīng)常會用到socket庫,而socket最常用,最常用的一個功能就是:“連接->發(fā)送數(shù)據(jù)->接收數(shù)據(jù)->斷開連接->回調(diào)結(jié)果”

所以,如果需要把這個流程,封裝成一個功能塊是很有意義的。

但是,這里有一個問題,是阻礙封裝的,就是 "接收數(shù)據(jù)->斷開連接",socket讀取數(shù)據(jù)時,是一個inputStream,是個流,也就是說,其實,你并不知道,數(shù)據(jù)怎么樣才算接收 完整/完畢

可能,有的協(xié)議,是通過頭2個字節(jié)來判斷整個數(shù)據(jù)長度

可能,有的協(xié)議是有幀頭,幀尾,轉(zhuǎn)義符來判斷整個數(shù)據(jù)長度

……

這讓我們很頭疼,那怎么 解決了,既然無法知道的東西,就讓應(yīng)用程序來告訴你唄。和上面一樣,傳入一個協(xié)議實現(xiàn)唄:

public interface UnZipDataAction{
// 返回null,表示未接收完全,繼續(xù)接收,返回完整的byte[]就認為是已經(jīng)接收完畢,把結(jié)果返回給應(yīng)用,并且斷開連接
 byte[] getRealData(byte[] recvData); ErrorCode getErrorCode(); }

這樣,我們就把“連接->發(fā)送數(shù)據(jù)->接收數(shù)據(jù)->斷開連接->回調(diào)結(jié)果”整個流程封裝成了通用的功能塊了。

解耦總結(jié)來說就是:你能知道的東西就寫死,不知道但是又必須知道的東西,就讓應(yīng)用程序來告訴你,在java里面叫接口,在有些語言(OC, swift, C/C++)里面叫做代碼段。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • eclipse構(gòu)建和發(fā)布maven項目的教程

    eclipse構(gòu)建和發(fā)布maven項目的教程

    這篇文章主要為大家詳細介紹了eclipse構(gòu)建和發(fā)布maven項目的教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • SpringMVC?中的視圖使用?JSP的過程

    SpringMVC?中的視圖使用?JSP的過程

    本文介紹了如何在?SpringMVC?中使用?JSP?視圖,包括如何創(chuàng)建?JSP?視圖、配置?JSP?視圖解析器、以及如何在控制器方法中使用JSP視圖,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2023-07-07
  • 關(guān)于Arrays.sort()使用的注意事項

    關(guān)于Arrays.sort()使用的注意事項

    這篇文章主要介紹了關(guān)于Arrays.sort()使用的注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue 實現(xiàn)刪除對象的元素 delete

    vue 實現(xiàn)刪除對象的元素 delete

    這篇文章主要介紹了vue 實現(xiàn)刪除對象的元素delete,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springMVC詳細介紹

    springMVC詳細介紹

    下面小編就為大家?guī)硪黄赟pring MVC 詳細介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • mybatis plus開發(fā)過程中遇到的問題記錄及解決

    mybatis plus開發(fā)過程中遇到的問題記錄及解決

    這篇文章主要介紹了mybatis plus開發(fā)過程中遇到的問題記錄及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring Boot jpa Service層代碼實例

    Spring Boot jpa Service層代碼實例

    這篇文章主要介紹了Spring Boot jpa Service層代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java使用組合模式實現(xiàn)表示公司組織結(jié)構(gòu)功能示例

    Java使用組合模式實現(xiàn)表示公司組織結(jié)構(gòu)功能示例

    這篇文章主要介紹了Java使用組合模式實現(xiàn)表示公司組織結(jié)構(gòu)功能,簡單描述了組合模式的概念、功能并結(jié)合實例形式分析了Java使用組合模式實現(xiàn)公司組織結(jié)構(gòu)表示功能具體操作步驟與相關(guān)注意事項,需要的朋友可以參考下
    2018-05-05
  • java實現(xiàn)酒店管理系統(tǒng)

    java實現(xiàn)酒店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Java進階學習:jar打包詳解

    Java進階學習:jar打包詳解

    Java進階學習:jar打包詳解...
    2006-12-12

最新評論