控制反轉(IoC) 與 相依性注入(DI) 簡單說明
角色:
- A.老師
- B.班長(我)
- C.國文小老師
- D.數學小老師
情境:
1.國文考試後老師要我叫國文小老師幫他改考卷
public class 班長
{
國文小老師 LittleTeacher = new 國文小老師();
public void 找小老師改考卷()
{
LittleTeacher.改考卷();
}
}
2.數學考試後老師要我叫數學小老師幫他改考卷
public class 班長
{
數學小老師 LittleTeacher = new 數學小老師();
public void 找小老師改考卷()
{
LittleTeacher.改考卷();
}
}
控制反轉IoC:宣告一個小老師的介面,讓班長宣告時不用直接宣告 [國文或數學小老師] 類別,改為宣告 I小老師 介面。
public interface I小老師
{
改考卷();
}
public class 班長
{
I小老師 D = new 數學小老師();
public void 找小老師改考卷()
{
D.改考卷();
}
}
DI:宣告介面時不直接實體化 [國文或數學小老師],而改由建構式來接收的 [國文或數學小老師] 實體
public class 老師
{
數學小老師 LittleTeacher = new 數學小老師();
改考卷(LittleTeacher);
}
public class 班長
{
I小老師 LittleTeacher;
班長(I小老師 littleTeacher)
{
this.LittleTeacher = littleTeacher;
}
public void 找小老師改考卷()
{
D.改考卷();
}
}
如此一來班長這個角色就不用知道小老師到底是誰,而改由呼叫班長的老師直接指派
對於班長來說就只需要知道自己需要有改考卷的這件事,但不用自己改而是交給小老師改
並且事先也不用知道到底是要交給哪個小老師,而是由大老師呼叫班長時會直接告知是哪位小老師
最後只要大家按照訂好的小老師介面來作業,無論今天老師多了物理小老師還是化學小老師需要改的考卷,對於班長來說都沒有影響
- 結果:對於我們班長這個角色,就達到了降低耦合的目標,自身不受類別的影響。