java設計模式學習筆記--依賴倒轉原則

依賴倒轉原則簡述

1.高層模塊不該該依賴低層模塊,兩者都應該依賴其抽象

2.抽象不該該依賴細節,細節應該依賴抽象

3.依賴倒轉得中心思想時面向接口編程

4.依賴倒轉原則時基於這樣得設計理念:相對於細節得多變性,抽象得東西要穩定得多。以抽象爲基礎搭建的架構比以細節爲基礎搭建的架構要穩定得多。在java中,抽象指的時接口或是抽象類,細節就是具體得實現類

5.使用接口或抽象類的目的時規定好規範,而不涉及任何具體操做,把展示細節的任務交給他們的實現類完成

依賴倒轉原則的三種實現方式

1.接口傳遞

2.構造方法傳遞

3.setter方式傳遞

應用實例

沒有使用依賴倒轉原則

public class DependecyInversion {
    public static void main(String[] args) {
        Person p = new Person();
        p.receive(new Email());
    }
}

/*
 * 完成Person接收消息的功能
 *方式1分析
 *1. 簡單,比較容易想到
 *2. 若是咱們獲取的對象是微信,短信等等,則新增類,同時Person類也要增長相應的接受方法
 *3.解決思路:引入一個抽象的接口IReceiver,表示接收者,這樣Person類 與接口IReceiver發生依賴
 *由於Email,微信,等等屬於接收的範圍,他們各自實現IReceiver接口就ok了,這樣咱們就符合依賴倒轉原則
 */
class Email{
    public String getInfo() {
        return "電子郵件信息:hello, world";
    }
}
class Person{
    public void receive(Email email) {
        System.out.println(email.getInfo());
    }
}
複製代碼

接口傳遞

public class DependecyInversionTest {
    public static void main(String[] args) {
        //方法1,經過接口實現
        ChangHong changHong = new ChangHong();  //建立ChangHong類的對象
        OpenAndClose openAndClose = new OpenAndClose();  //建立OpenAndClose類的對象
        openAndClose.open(changHong);     //經過接口實現
    }
}

//方式1:經過接口傳遞依賴
interface IOpenAndClose {
    public void open(ITV tv);
}

interface ITV {
    public void play();
}

class OpenAndClose implements IOpenAndClose{
    public void open(ITV tv) {
        tv.play();
    }
}

class ChangHong implements ITV{
    public void play() {
        System.out.println("打開");
    }
}
複製代碼

構造方法傳遞

public class DependecyInversionTest {
    public static void main(String[] args) {
        //方法2,經過構造器實現
        ChangHong changHong = new ChangHong();  //建立ChangHong類的對象
        OpenAndClose openAndClose= new OpenAndClose(changHong);  //建立OpenAndClose類的對象
        openAndClose.open();    //經過構造器實現   
    }
}

//方式2,經過構造方法依賴傳遞
interface IOpenAndClose {
    public void open();
}

interface ITV{
    public void play();
}

class OpenAndClose{
    public ITV tv;
    public OpenAndClose(ITV tv) {
        this.tv = tv;
    }
    public void open() {
        this.tv.play();
    }
}

class ChangHong implements ITV{
    
    @Override
    public void play() {
        // TODO Auto-generated method stub
        System.out.println("打開");
    }
    
}
複製代碼

setter方式傳遞

public class DependecyInversionTest {
    public static void main(String[] args) {
        //方法3,經過setter方式實現
        ChangHong changHong = new ChangHong();   //建立ChangHong類的對象
        OpenAndClose openAndClose = new OpenAndClose();  //建立ChangHong類的對象
        openAndClose.setTV(changHong);  //經過setter方式傳遞
        openAndClose.open();  //調用open()方法
    }
}

//方式3,經過setter方法傳遞
interface IOpenAndClose{
    public void open();
}

interface ITV{
    public void play();
}

class ChangHong implements ITV{
    public ITV tv;
    public void play() {
        System.out.println("打開");
    }
}

class OpenAndClose implements IOpenAndClose{
    public ITV tv;
    public void setTV(ITV tv) {
        this.tv = tv;
    }
    public void open() {
        this.tv.play();
    }
}複製代碼
相關文章
相關標籤/搜索