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

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設計模式依賴倒轉原則的資料請關註WalkonNet其它相關文章!

推薦閱讀: