首頁 > 軟體

java設計模式七大原則之依賴倒轉原則詳解

2022-02-11 13:01:28

1.什麼是依賴倒轉原則?

  1. 高層模組不應該依賴低層模組,二者都應該依賴其抽象。
  2. 抽象不應該依賴細節,細節應該依賴抽象。
  3. 依賴倒轉 (倒置) 的中心思想是面向介面程式設計。
  4. 依賴倒轉原則是基於這樣的設計理念:相對於細節的多變性,抽象的東西要穩定的多。以抽象為基礎搭建的架構比以細節為基礎的架構要穩定的多。在Java中,抽象指的是介面或抽象類,細節就是具體的實現類。
  5. 使用介面或抽象類的目的是制定好規範,而不涉及任何具體的操作,把展現細節的任務交給他們的實現類去完成。

2.程式碼案例

package com.szh.principle.inversion;
 
/**
 *
 */
class Email {
    public String getInfo() {
        return "電子郵件資訊: hello,world";
    }
}
// 完成Person接收訊息的功能
// 方式1分析
//   1. 簡單,比較容易想到
//   2. 如果我們獲取的物件是 微信,簡訊等等,則新增類,同時Person也要增加相應的接收方法
//   3. 解決思路:引入一個抽象的介面IReceiver, 表示接收者, 這樣Person類與介面IReceiver發生依賴
//   因為Email, WeiXin 等等屬於接收的範圍,他們各自實現IReceiver 介面就ok, 這樣我們就符號依賴倒轉原則
class Person {
    public void receive(Email email ) {
        System.out.println(email.getInfo());
    }
}
public class DependencyInversion {
    public static void main(String[] args) {
        Person person = new Person();
        person.receive(new Email());
    }
}

 我們可以根據依賴倒轉原則對上面的程式碼做一個改進,如下:

package com.szh.principle.inversion.improve;
/**
 *
 */
//定義介面
interface IReceiver {
    public String getInfo();
}
class Email implements IReceiver {
    public String getInfo() {
        return "電子郵件資訊: hello,world";
    }
}
//增加微信
class WeiXin implements IReceiver {
    public String getInfo() {
        return "微信資訊: hello,ok";
    }
}
//方式2
class Person {
    //這裡我們是對介面的依賴
    public void receive(IReceiver receiver ) {
        System.out.println(receiver.getInfo());
    }
}
public class DependencyInversion {
    public static void main(String[] args) {
        //使用者端無需改變
        Person person = new Person();
        person.receive(new Email());
        person.receive(new WeiXin());
    }
}

3.依賴關係傳遞的三種方式和案例舉例

3.1 介面傳遞

package com.szh.principle.inversion.improve;
/**
 * 方式1: 通過介面傳遞實現依賴
 */
 interface IOpenAndClose1 {
    public void open(ITV1 tv); //抽象方法,接收介面
 }
 interface ITV1 { //ITV介面
    public void play();
 }
class OpenAndClose1 implements IOpenAndClose1 {
     @Override
     public void open(ITV1 tv){
         tv.play();
     }
}
 class ChangHong1 implements ITV1 {
	@Override
	public void play() {
		System.out.println("長虹電視機,開啟");
	}
 }
public class DependencyPass1 {
    public static void main(String[] args) {
        ChangHong1 changHong = new ChangHong1();
		OpenAndClose1 openAndClose = new OpenAndClose1();
		openAndClose.open(changHong);
    }
}

3.2 構造方法傳遞

package com.szh.principle.inversion.improve;
/**
 * 方式2: 通過構造方法依賴傳遞
 */
 interface IOpenAndClose2 {
    public void open(); //抽象方法
 }
 interface ITV2 { //ITV介面
    public void play();
 }
 class OpenAndClose2 implements IOpenAndClose2 {
    public ITV2 tv; //成員
 
    public OpenAndClose2(ITV2 tv){ //構造器
        this.tv = tv;
    }
    public void open(){
        this.tv.play();
    }
 }
class ChangHong2 implements ITV2 {
    public void play() {
        System.out.println("長虹電視機,開啟");
    }
}
public class DependencyPass2 {
    public static void main(String[] args) {
        ChangHong2 changHong = new ChangHong2();
        //通過構造器進行依賴傳遞
		OpenAndClose2 openAndClose = new OpenAndClose2(changHong);
		openAndClose.open();
    }
}

3.3 setter方法傳遞

package com.szh.principle.inversion.improve;
 
/**
 * 方式3: 通過setter方法傳遞
 */
interface IOpenAndClose3 {
    public void open(); // 抽象方法
    public void setTv(ITV3 tv);
}
interface ITV3 { // ITV介面
    public void play();
}
class OpenAndClose3 implements IOpenAndClose3 {
    private ITV3 tv;
    public void setTv(ITV3 tv) {
        this.tv = tv;
    }
    public void open() {
        this.tv.play();
    }
}
class ChangHong3 implements ITV3 {
    public void play() {
        System.out.println("長虹電視機,開啟");
    }
}
public class DependencyPass3 {
    public static void main(String[] args) {
        ChangHong3 changHong = new ChangHong3();
        //通過setter方法進行依賴傳遞
        OpenAndClose3 openAndClose = new OpenAndClose3();
        openAndClose.setTv(changHong);
        openAndClose.open();
    }
}

4.依賴倒轉原則總結

  • 低層模組儘量都要有抽象類或介面,或者兩者都有,程式穩定性更好。
  • 變數的宣告型別儘量是抽象類或介面,這樣我們的變數參照和實際物件間,就存在一個緩衝層,利於程式擴充套件和優化。
  • 繼承時遵循里氏替換原則。

以上就是java設計模式七大原則依賴倒轉原則的詳細內容,更多關於java設計模式依賴倒轉原則的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com