3. 目標精通--用java寫設計模式:依賴倒轉原則

small_clear發表於2020-11-20

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();
    }

}

相關文章