您好,登錄后才能下訂單哦!
依賴倒置原則就是抽象類和接口在使用時(shí)的一些規(guī)范和建議,我們的應(yīng)用上層模塊不直接依賴于下層模塊,不具體依賴某個(gè)類或者對(duì)象,而是依賴于某個(gè)抽象。
接著上一節(jié)的Demo,我們有3個(gè)手機(jī)的對(duì)象。分別是LumiaPhone,Galaxy,ApplePhone,現(xiàn)在我們新增一個(gè)Student學(xué)生類,學(xué)生會(huì)使用手機(jī)。有可能使用LumiaPhone手機(jī),也有可能使用Galaxy,也有可能使用
ApplePhone,那我們的Student看起來的得實(shí)現(xiàn)成這樣:
public class Student { public int Id { get; set; } public string Name { get; set; } public void PlayPhone(LumiaPhone lumiaPhone) { Console.WriteLine($"{Name} use {lumiaPhone.Name}"); } public void PlayApplePhone(ApplePhone applePhone) { Console.WriteLine($"{Name} use {applePhone.Name}"); } public void PlayGalaxy(Galaxy galaxy) { Console.WriteLine($"{Name} use {galaxy.Name}"); } }
具體使用時(shí),我們可能會(huì)是這樣: 先創(chuàng)建一個(gè)Student再根據(jù)學(xué)生使用的某種手機(jī) 調(diào)用不同的play方法
LumiaPhone lumiaPhone = new LumiaPhone(); ApplePhone applePhone = new ApplePhone(); Galaxy galaxy = new Galaxy(); Student student = new Student(); student.PlayPhone(lumiaPhone); student.PlayApplePhone(applePhone); student.PlayGalaxy(galaxy);
這個(gè)時(shí)候假設(shè)Student舊的手機(jī)壞了,換了新的華為手機(jī),那我們新增一個(gè)Honor對(duì)象
public class Honor { public void System() { Console.WriteLine("Hua Wei Honor"); } }
再修改Student類 新增一個(gè)方法
public void PlayHonor(Honor honor) { Console.WriteLine($"{Name} use {honor.Name}"); }
使用時(shí)
Honor honor = new Honor(); student.PlayHonor(honor);
手機(jī)有太多種類,每次新增對(duì)象我們都要在Student中新增方法 在調(diào)用處進(jìn)行手機(jī)的實(shí)例化,維護(hù)起來 非常麻煩,容易出錯(cuò)。不利于擴(kuò)展,所以我們的Student 不應(yīng)該依賴于具體的類,而是應(yīng)該依賴抽象 上一遍提到的BasePhone,我們來改造下代碼 Student會(huì)變成這樣
public class Student { public int Id { get; set; } public string Name { get; set; } public void PlayPhone(BasePhone basePhone) { Console.WriteLine($"{Name} use {basePhone.Name}"); } //public void PlayPhone(LumiaPhone lumiaPhone) //{ // Console.WriteLine($"{Name} use {lumiaPhone.Name}"); //} //public void PlayApplePhone(ApplePhone applePhone) //{ // Console.WriteLine($"{Name} use {applePhone.Name}"); //} //public void PlayGalaxy(Galaxy galaxy) //{ // Console.WriteLine($"{Name} use {galaxy.Name}"); //} //public void PlayHonor(Honor honor) //{ // Console.WriteLine($"{Name} use {honor.Name}"); //} }
我們的調(diào)用處
static void Main(string[] args)
{
{
LumiaPhone lumiaPhone = new LumiaPhone();
ApplePhone applePhone = new ApplePhone();
Galaxy galaxy = new Galaxy();
Honor honor = new Honor();
Student student = new Student();
student.PlayPhone(lumiaPhone);
student.PlayPhone(applePhone);
student.PlayPhone(galaxy);
student.PlayPhone(honor);
//student.PlayPhone(lumiaPhone);
//student.PlayApplePhone(applePhone);
//student.PlayGalaxy(galaxy);
//student.PlayHonor(honor);
}
Console.ReadKey();
}
這個(gè)時(shí)候感覺Main還是依賴了具體的對(duì)象Student,以學(xué)生使用honor手機(jī)為例
BasePhone honor = new Honor(); Student student = new Student(); student.PlayPhone(honor);
我們新增一個(gè)SimpleFactory及接口IPlayPhone
public static class SimpleFactory { public static BasePhone CreatePhone() { return new Honor(); } public static Student CreateStudent() { return new Student(); } }
public interface IPlayPhone { void PlayPhone(BasePhone basePhone); }
那我們的Main方法則變成
static void Main(string[] args) { { BasePhone honor = SimpleFactory.CreatePhone(); IPlayPhone student = SimpleFactory.CreateStudent(); student.PlayPhone(honor); //Honor honor = new Honor(); //Student student = new Student(); //student.PlayPhone(honor); //student.PlayPhone(lumiaPhone); //student.PlayApplePhone(applePhone); //student.PlayGalaxy(galaxy); //student.PlayHonor(honor); } Console.ReadKey(); }
我在這個(gè)demo SimpleFactory里直接返回了一個(gè)對(duì)象,項(xiàng)目中是可以通過讀取配置文件反射來構(gòu)造實(shí)的
這樣只要通過改配置文件 就可以實(shí)現(xiàn)學(xué)生更換手機(jī)的功能,同樣通過配置文件 也可以實(shí)現(xiàn) 老師使用手機(jī)只要我們新增一個(gè)Teacher類 實(shí)現(xiàn)IPlayPhone接口。其他代碼不需要任何改動(dòng), 這就是我們?cè)瓌t 依賴抽象或接口 而不應(yīng)該依賴于具體的細(xì)節(jié)的好處, 這里學(xué)生,老師其實(shí)就是上層,而我們的手機(jī)則是下層,上層不應(yīng)該依賴下層 而是應(yīng)該依賴抽象
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。