手工依賴注入。在原有例子的基礎上做小部分修改。
一個RPG遊戲,有武士的角色。武士為了榮耀而戰。首先要為一個武士配備一個合适的武器。
(1) 準備一件武器(Sword)
public class Sword
{
public void Hit(string strTarget)
Console.WriteLine("砍死{0}",strTarget);
}
(2)一個武士角色
public class Samurai
Sword _sword ;
public Samurai()
_sword = new Sword();
public void Attack(string strTarget)
_sword.Hit(strTarget);
(3)測試
[Test]
public void Test1()
Samurai sam = new Samurai();
sam.Attack("僵屍");
結果:
砍死僵屍
當一個類依賴于一個具體實作時,稱為:這個類對具體實作的類緊耦合。武士類對劍類緊耦合。當類緊耦合時,它們不能在不通知它們的實作的情況下完成自身的修改。如果要更換武器,那麼因為武士類對劍類緊耦合,那麼在修改武器的時候,還要修改對劍類緊耦合的武士本身。為了避免緊耦合的類。我們通常通過接口來提供間接的層面。
(4)接口實作
public interface IWeapon
void Hit(string target);
public class Sword : IWeapon
Console.WriteLine("砍死{0}",strTarget);
IWeapon _Weapon;
_Weapon = new Sword();
_Weapon.Hit(strTarget);
現在武器可以裝備不同的武器了。但是,劍類對象仍然是在武士對象的構造器中建立的。我們仍然需要在為武士裝備另一種武器的時候還要通知武士的實作,武士類仍然對劍類緊耦合。這裡有一個簡單的解決方法。與其在武士類構造器内部建立劍類的執行個體,不如以構造參數的方式來代替。
(5)構造參數
public Samurai(IWeapon Weapon)
_Weapon = Weapon;
Samurai sam = new Samurai(new Sword());
sam.Attack("僵屍");
現在,裝備武士,可以通過向武士類的構造方法向武士類注入武器(劍)。這是一個依賴注入的例子(具體來說是一個構造注入)。現在建立另一種可能用到的武器:
(6)添加武器
public class Shuriken : IWeapon
public void Hit(string target)
Console.WriteLine("刺穿{0}的咽喉 ", target);
(7)測試
Samurai sam = new Samurai(new Sword());
Samurai sam2 = new Samurai(new Shuriken());
sam.Attack("僵屍");
sam2.Attack("僵屍");
任何時候,當要建立一個武士角色時,首先必須建立一個武器接口的實作,然後把它傳到武士的構造器中。現在修改武士武器的時候,不用再來修改這個武士類的實作了,這個武士類的程式集可以和武器類的程式集分開了。事實上,我們可以在不需要武士類源檔案的情況下添加新武器了。手動依賴注入對于小型的項目來說是個有效的政策。
部落格園大道至簡
<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>
轉載請注明:部落格園