1. 什麼是依賴倒轉原則
- 高層模組不應該依賴於低層模組,二者都應該依賴其抽象
- 抽象不應該依賴細節,細節應該依賴於抽象.抽象指的就是抽象類和介面
- 其中心思想就是面向介面程式設計
- 使用介面和抽象類的目的是制定規範,而不設計任何具體的操作,把細節交給實現類去完成
- 通俗來講就是,我們不應該建立一個孤零零的類,而應該建立介面,規定好方法,以及每個方法的功能,然後具體的方法實現由實現類操作,而我們在就進行方法呼叫時,應該是通過介面來呼叫方法,而不是直接new一個實現類的直接物件出來,使用方式可以用多型的形式通過父類物件引用指向子類物件
2. 例項
- 不使用依賴倒轉的情況
- 這樣看上去很簡單,但是如果要再加一個簡訊傳送,然後再加一個微信傳送呢
public class DependenceInversion {
public static void main(String[] args) {
Person person = new Person();
person.getInfo(new Email());
}
}
class Email{
public void getInfo(){
System.out.println("接收email郵件");
}
}
class Person{
public void getInfo(Email email){
email.getInfo();
}
}
- 增加微信訊息的方法
- 這樣,我們需要再建立一個微信類然後再person類中再加一個微信傳送的方法
- 傳送的形式越多,我們在person類中增加的方法也就越多,然而實際上我們每次呼叫,都只需要其中的一種方法
public class DependenceInversion {
public static void main(String[] args) {
Person person = new Person();
person.getEmailInfo(new Email());
person.getWeixinInfo(new Weixin());
}
}
class Email{
public void getInfo(){
System.out.println("接收email郵件");
}
}
class Weixin{
public void getInfo(){
System.out.println("接收微信訊息");
}
}
class Person{
public void getEmailInfo(Email email){
email.getInfo();
}
public void getWeixinInfo(Weixin weixin){
weixin.getInfo();
}
}
3. 改進
- 建立一個介面’Info’,在其中規定一個getInfo的方法
- 建立Email類與Weixin類,都實現Info介面,並實現getInfo方法
- 而在person中,我們只需要建立一個’getInfo’的方法用於接收訊息,方法引數為介面’Info’物件
- 通過多型的特性我們可以知道,當形參使用了介面物件時,那麼實際傳進來的引數可以是該介面的任何子類
- 所以在person中,只需要呼叫Info.getInfo()方法,就行了,至於呼叫的具體是email還是weixin就不用考慮了,那是呼叫方考慮的事
- 當呼叫方呼叫person.getInfo方法時,傳的是Info的哪個子類物件,就呼叫哪個子類物件的實現方法
- 無論有再多獲取資訊的形式,就算再加一個簡訊獲取,加一個qq資訊獲取,只要需要建立一個物件,實現Info介面就行了,Person中不需要做任何改動
- 這就是依賴倒倒置原則,不依賴與直接物件,而依賴於物件的抽象
public class DependenceInversion {
public static void main(String[] args) {
Person person = new Person();
person.getInfo(new Email());
person.getInfo(new Weixin());
}
}
interface Info{
void getInfo();
}
class Email implements Info{
public void getInfo(){
System.out.println("接收email郵件");
}
}
class Weixin implements Info{
@Override
public void getInfo() {
System.out.println("接收微信訊息");
}
}
class Person{
public void getInfo(Info info){
info.getInfo();
}
}