最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

什么是耦合性

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

什么是程序間的耦合

假如:當(dāng)我去new一個(gè)對(duì)象的時(shí)候,而這個(gè)對(duì)象不存在,這個(gè)時(shí)候程序會(huì)報(bào)編譯時(shí)異常,也就意味著程序連運(yùn)行都運(yùn)行不了,我們可以理解為他們的耦合度較高。

如何解耦

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

工廠模式解耦

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

案例

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

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

原因就是:

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

解決思路:

當(dāng)是我們講解 jdbc 時(shí),是通過(guò)反射來(lái)注冊(cè)驅(qū)動(dòng)的,代碼如下:

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

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

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

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

解耦合

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

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

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

這里,我們先舉個(gè)栗子,比如排序

一個(gè)排序功能,對(duì)于大部分比較初級(jí)的程序猿來(lái)說(shuō),可能會(huì)寫(xiě)成這樣:

sort(List<Integer> list)

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

我們先要明確,我們需要做的是排序功能,在這個(gè)過(guò)程中,我們不可避免的需要使用2個(gè)數(shù)據(jù)的大小對(duì)比,而這個(gè)數(shù)據(jù),可能是任何數(shù)據(jù),也就是說(shuō),排序算法,我們是可以確定下來(lái),做成不動(dòng)的庫(kù),但是有一個(gè)數(shù)據(jù)大小匹配是我們無(wú)法做到的,或者說(shuō)是庫(kù)的耦合點(diǎn),那怎么辦呢?

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

下面,我們參考Android庫(kù)里面,有個(gè)排序的api

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

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

我們?cè)倥e個(gè)栗子,socket

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

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

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

可能,有的協(xié)議,是通過(guò)頭2個(gè)字節(jié)來(lái)判斷整個(gè)數(shù)據(jù)長(zhǎng)度

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

……

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

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

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

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

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

相關(guān)文章

  • Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過(guò)程解析

    Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過(guò)程解析

    在Mybatis中,我們需要?jiǎng)?chuàng)建一個(gè)與實(shí)體類對(duì)應(yīng)的Mapper接口,然后在該接口上添加方法,這些方法對(duì)應(yīng)著SQL語(yǔ)句,這篇文章主要介紹了Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過(guò)程,需要的朋友可以參考下
    2023-11-11
  • Java項(xiàng)目中如何引入Hutool工具類并正確使用它

    Java項(xiàng)目中如何引入Hutool工具類并正確使用它

    Hutool是一個(gè)小而全的Java工具類庫(kù),通過(guò)靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,使Java擁有函數(shù)式語(yǔ)言般的優(yōu)雅,這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目中如何引入Hutool工具類并正確使用它的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Spring?Boot?2.6.x整合Swagger啟動(dòng)失敗報(bào)錯(cuò)問(wèn)題的完美解決辦法

    Spring?Boot?2.6.x整合Swagger啟動(dòng)失敗報(bào)錯(cuò)問(wèn)題的完美解決辦法

    這篇文章主要給大家介紹了關(guān)于Spring?Boot?2.6.x整合Swagger啟動(dòng)失敗報(bào)錯(cuò)問(wèn)題的完美解決辦法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Spring Boot2深入分析解決java.lang.ArrayStoreException異常

    Spring Boot2深入分析解決java.lang.ArrayStoreException異常

    這篇文章介紹了Spring Boot2深入分析解決java.lang.ArrayStoreException異常的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • JRebel在線激活破解實(shí)現(xiàn)教程

    JRebel在線激活破解實(shí)現(xiàn)教程

    這篇文章主要介紹了JRebel在線激活破解實(shí)現(xiàn)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • SpringBoot登錄、退出、獲取用戶信息的session處理方案

    SpringBoot登錄、退出、獲取用戶信息的session處理方案

    這篇文章主要介紹了SpringBoot登錄、退出、獲取用戶信息的session處理,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • SpringSecurity配置HTTPS的實(shí)現(xiàn)

    SpringSecurity配置HTTPS的實(shí)現(xiàn)

    本文介紹了SpringBoot項(xiàng)目中配置HTTPS并集成SpringSecurity,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Java實(shí)現(xiàn)Html轉(zhuǎn)Pdf的方法

    Java實(shí)現(xiàn)Html轉(zhuǎn)Pdf的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)Html轉(zhuǎn)Pdf的方法,實(shí)例分析了java基于ITextRenderer類操作頁(yè)面及系統(tǒng)自帶字體生成pdf文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Win10系統(tǒng)下配置java環(huán)境變量的全過(guò)程

    Win10系統(tǒng)下配置java環(huán)境變量的全過(guò)程

    這篇文章主要給大家介紹了關(guān)于Win10系統(tǒng)下配置java環(huán)境變量的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring Boot 中的自動(dòng)配置autoconfigure詳解

    Spring Boot 中的自動(dòng)配置autoconfigure詳解

    這篇文章主要介紹了Spring Boot 中的自動(dòng)配置autoconfigure詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01

最新評(píng)論

合作市| 蒲江县| 大港区| 于田县| 剑阁县| 图片| 柞水县| 灌南县| 弥渡县| 霍州市| 临武县| 金昌市| 新巴尔虎右旗| 岚皋县| 库尔勒市| 岑溪市| 桃园县| 淄博市| 南投市| 万荣县| 临西县| 广西| 娱乐| 巴塘县| 漳平市| 景东| 景泰县| 吉林市| 陇南市| 武宁县| 桐梓县| 乐陵市| 祁门县| 儋州市| 得荣县| 抚顺市| 锦屏县| 吉木乃县| 绍兴县| 大足县| 潼南县|