?依賴倒置原則(Dependence Inversion Principle,DIP)是指設(shè)計(jì)代碼結(jié)構(gòu)時(shí),高層模塊不應(yīng)該依賴低層模塊,二者都該依賴其抽象。即抽象不該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。通過依賴倒置,可以減少類與類之間的耦合性,提高系統(tǒng)的穩(wěn)定性,提高代碼的可讀性和可維護(hù)性,同時(shí)能夠降低對(duì)系統(tǒng)修改時(shí)帶來的風(fēng)險(xiǎn)。
?好了暈車了對(duì)嘛,來看一段代碼。還是以之前的賣出去的書為例,創(chuàng)建一個(gè)類IRead:
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description 我愛讀書,讀書讓我快樂
* @Date: Create in 10:22 2020/4/9
*/
public class IRead {
public void readJavaBook(){
System.out.println("我正在看Java的書,我可真棒!");
}
public void readPythonBook(){
System.out.println("我正在看Python的書,我可真棒!");
}
}
調(diào)用一下
public static void main(String[] args) {
IRead iRead = new IRead();
iRead.readJavaBook();
iRead.readPythonBook();
}
?書籍是人類進(jìn)步的階梯,看書是會(huì)上癮的。隨著求知欲的提升,我現(xiàn)在還想看AI相關(guān)的書。這個(gè)時(shí)候,因?yàn)闃I(yè)務(wù)需求的擴(kuò)展,需要從低層到高層依次修改代碼,要在IRead類中添加readAIBook方法,同時(shí)在main方法中添加調(diào)用。在真正的業(yè)務(wù)環(huán)境中,系統(tǒng)往往十分龐大,這樣的由底到頂?shù)男薷膶?shí)際上是非常不穩(wěn)定的,對(duì)代碼的修改也容易帶來意想不到的風(fēng)險(xiǎn)。
?接下來我們對(duì)代碼架構(gòu)進(jìn)行優(yōu)化來解決這個(gè)問題,首先創(chuàng)建一個(gè)看書的抽象接口Read:
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description 看書的抽象接口
* @Date: Create in 10:37 2020/4/9
*/
public interface Read {
void readBook();
}
接下來編寫ReadJava類
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description
* @Date: Create in 10:40 2020/4/9
*/
public class ReadJava implements Read {
public void readBook() {
System.out.println("我正在看Java的書,我可真棒!");
}
}
編寫ReadPython類
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description
* @Date: Create in 10:42 2020/4/9
*/
public class ReadPython implements Read {
public void readBook() {
System.out.println("我正在看Python的書,我可真棒!");
}
}
對(duì)之前的IRead類進(jìn)行修改:
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description 我愛讀書,讀書讓我快樂
* @Date: Create in 10:22 2020/4/9
*/
public class IRead {
public void read(Read read) {
read.readBook();
}
}
調(diào)用一下
public static void main(String[] args) {
IRead iRead = new IRead();
iRead.read(new ReadJava());
iRead.read(new ReadPython());
}
?再回頭看之前的業(yè)務(wù)需求。不管我再怎么熱愛學(xué)習(xí),對(duì)于新書,只需要新建一個(gè)看書的類,通過傳參的方式來學(xué)習(xí),而不需要再去修改底層代碼。實(shí)際上這就是我們非常熟悉的方式,依賴注入。注入的方式還有構(gòu)造器方式和Setter方式,這里不做贅述。
總結(jié)
?以抽象為基準(zhǔn)比以細(xì)節(jié)為基準(zhǔn)搭建起來的架構(gòu)要穩(wěn)定很多,因此在拿到需求的時(shí)候,要面向接口編程,先頂層再細(xì)節(jié)的設(shè)計(jì)代碼結(jié)構(gòu)。
文章參考
《Spring5核心原理》〔中〕譚勇德(Tom)