依賴倒置原則就是抽象類和接口在使用時(shí)的一些規(guī)范和建議,我們的應(yīng)用上層模塊不直接依賴于下層模塊,不具體依賴某個(gè)類或者對(duì)象,而是依賴于某個(gè)抽象。
為南通等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及南通網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、南通網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!接著上一節(jié)的Demo,我們有3個(gè)手機(jī)的對(duì)象。分別是LumiaPhone,Galaxy,ApplePhone,現(xiàn)在我們新增一個(gè)Student學(xué)生類,學(xué)生會(huì)使用手機(jī)。有可能使用LumiaPhone手機(jī),也有可能使用Galaxy,也有可能使用
ApplePhone,那我們的Student看起來(lái)的得實(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ù)起來(lái) 非常麻煩,容易出錯(cuò)。不利于擴(kuò)展,所以我們的Student 不應(yīng)該依賴于具體的類,而是應(yīng)該依賴抽象 上一遍提到的BasePhone,我們來(lái)改造下代碼 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í)候感覺(jué)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)目中是可以通過(guò)讀取配置文件反射來(lái)構(gòu)造實(shí)的
這樣只要通過(guò)改配置文件 就可以實(shí)現(xiàn)學(xué)生更換手機(jī)的功能,同樣通過(guò)配置文件 也可以實(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)該依賴抽象
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。