溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

依賴倒置原則(二)

發(fā)布時(shí)間:2020-06-21 00:35:41 來源:網(wǎng)絡(luò) 閱讀:331 作者:ccandzy 欄目:編程語言

依賴倒置原則就是抽象類和接口在使用時(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)該依賴抽象


向AI問一下細(xì)節(jié)

免責(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)容。

AI