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("西瓜");
}
}
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是一個好用的方法,對於日後程式的維護可以花費較少的心力。
如果說的有問題歡迎提出。