面向對象六大原則(四):依賴倒置原則

一、概述

依賴倒置原則(Dependence Inversion Principle ,縮寫:DIP),是程序要依賴於抽象接口,不要依賴於具體實現。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合。

二、原則

1.高層次的模塊不應該依賴於低層次的模塊,他們都應該依賴於抽象。

2.抽象不應該依賴於具體實現,具體實現應該依賴於抽象。

三、實現方法

下面引用一個簡單示例:
    //抽象汽車
    public interface ICar {
        void Run();
        void Turn();
        void Stop();
    }

    //抽象的具體實現
    public class BmwCar implements ICar {
        @Override
        public void Run() {
            System.out.print("寶馬開始啓動了");
        }

        @Override
        public void Turn() {
            System.out.print("寶馬轉彎了");
        }

        @Override
        public void Stop() {
            System.out.print("寶馬停了");
        }
    }

    //抽象的具體實現
    public class FllCar implements ICar {
        @Override
        public void Run() {
            System.out.print("法拉利開始啓動了");
        }

        @Override
        public void Turn() {
            System.out.print("法拉利轉彎了");
        }

        @Override
        public void Stop() {
            System.out.print("法拉利停了");
        }
    }

    public class AutoSystem {
        private ICar icar;

        //依賴於抽象ICar
        public AutoSystem(ICar icar) {
            this.icar = icar;
        }

        private void RunCar() {
            icar.Run();
        }

        private void TurnCar() {
            icar.Turn();
        }

        private void StopCar() {
            icar.Stop();
        }
    }

現在AutoSystem系統依賴於ICar這個抽象,而與具體的實現細節BmwCar、FllCar無關,所以實現細節的變化不會影響AutoSystem。對於實現細節只要實現ICar即可,即實現細節依賴於ICar抽象。

從我的另一篇博客 “面向對象六大原則(二):開閉原則” 的示例代碼中也是同樣的道理,我們建立了ImageCache抽象,並且讓ImageLoader依賴於抽象而不是具體細節。當需求發生變化時,只需要實現ImageCache類或者繼承其他已有的ImageCache子類完成相應的緩存功能,然後將具體的實現注入到ImageLoader即可實現緩存功能的替換,這就保證了緩存系統的高可擴展性,有了擁抱變化的能力,這就是依賴倒置原則。

四、分析
     
在java中,抽象就是指 “接口”或“抽象”類,兩者都是不能直接被實例化;細節就是實現類,實現接口或繼承抽象類而產生的類就是細節,其特點就是可以直接被(new)實例化。高層模塊就是調用端,低層模塊就是具體實現類。

在java中表現爲:模塊間的依賴通過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是通過接口或抽象類產生的。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章