iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
Mobile Development

android studio 30天學習筆記系列 第 22

android studio 30天學習筆記 -day 22-Dagger 前言

  • 分享至 

  • xImage
  •  

Dependency Injection

Dependency Injection中文翻譯為依賴注入。主要解決兩個類別耦合性過高的問題
(高耦合:當被依賴對象被修改時,依賴對象也會被修改)

依賴注入是指「被依賴物件透過外部注入至依賴物件的程式中使用」

舉個例子:假設顧客今天來到ABC水果攤買水果,可以表示Customer的class用到ABCFruitStand的class abcfruitStand =new ABCFruitStand();,也等同於顧客依賴於ABC水果攤。
但當顧客覺得ABC水果攤的水果太貴了想換別家水果攤,這樣ABCFruitStand的class會被更改,而Customer class裡的方法也會跟著變動,假設其他的Customer也有用到ABCFruitStand的class,那麼要改的地方就會更多了。

//第一家水果攤
public class ABCFruitStand {

    private String fruit;
    public void sellFruit(String fruit){
        this.fruit=fruit;
        System.out.println(fruit+"一顆50塊");
    }
}
// 第二家水果攤
public class GHEFruitStand {

    private String fruit;
    public void sellFruit(String fruit){
        this.fruit=fruit;
        System.out.println(fruit+"一顆50塊");
    }
}

public class Customer {

    public void buy(){
        ABCFruitStand abcfruitStand =new ABCFruitStand();
        abcfruitStand.sellFruit("西瓜");
        //去第二家水果攤(上面會被改成下面)
     // GHEFruitStand ghefruitStand =new GHEFruitStand();
     // ghefruitStand.sellFruit("西瓜");
    }
}

Dependency Injection優點:

  1. 低耦合
  2. 可維護性(Maintainability)
  3. 可測試性(Testablility)
  4. 平行開發(Parallel development)

Dependency Injection設計模式

constructor :傳入需要依賴的東西,當傳入的東西較多,constructor也會越來越大。

public class ABCFruitStand {

    private String fruit;
    public FruitStand(String fruit){
        this.fruit=fruit;
    }
}
public class Customer {

    private FruitStand fruitStand;
    public void buy(){
        fruitStand =new FruitStand("西瓜");
    }
}

setter:比constructor 較為彈性,可以傳較多的東西。

public class ABCFruitStand {
    //從外部注入
    private String fruit;
    public void setFruit(String fruit){
        this.fruit=fruit;
    }
}
public class Customer {

    private FruitStand fruitStand;
    public void buy(){
        fruitStand =new FruitStand();
        fruitStand.setFruit("西瓜");
    }
}

interface:只要有繼承FruitStand的類別都可以注入。

public interface FruitStand {
    void sellFruit(String fruitName);
}
public class CheapFruitStand implements FruitStand {

    @Override
    public void sellFruit(String fruitName) {

    }
}
public class FreshFruitStand implements FruitStand {
   @Override
    public void sellFruit(String fruitName) {

    }
}

總結:
Dependency Injection是一個好用的方法,對於日後程式的維護可以花費較少的心力。

如果說的有問題歡迎提出。


上一篇
android studio 30天學習筆記-day 21 -獲得日期
下一篇
30天學習筆記-day 23- Dagger (上篇)
系列文
android studio 30天學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言