軟件架構設計原則之迪米特法則


迪米特原則(Law of Demeter LoD)是指一個對象應該對其他對象保持最少的了解,又叫最少知道原則(Least Knowledge Principle,LKP),盡量降低類與類之間的耦合度。迪米特原則主要強調:只和朋友交流,不和陌生人說話。出現在成員變量、方法的輸入、輸出參數中的類都可以稱為成員朋友類,而出現在方法體內部的類不屬於朋友類。

現在來設計一個權限系統,Boss需要查看目前發布到線上的課程數量。這時候,Boss要找到TeamLeader去進行統計,TeamLeader再把統計結果告訴Boss。接下來我們還是來看代碼。

Course類的代碼如下:

public class Course {

}

TeamLeader類的代碼如下:

public class TeamLeader {

    public void checkNumberOfCourses(List<Course> courseList){

        System.out.println("目前已發布的課程數量是:"+courseList.size());

    }

}

Boss類的代碼如下:

public class Boss {

    public void commandCheckNumber(TeamLeader teamLeader){

    //模擬Boss一頁一頁往下翻頁,TeamLeader實時統計

            List<Course> courseList = new ArrayList<Course>();

            for (int i= 0; i < 20 ;i ++){

                courseList.add(new Course());

            }

            teamLeader.checkNumberOfCourses(courseList);

        }

    }

測試代碼如下:

public static void main(String[] args) {

    Boss boss = new Boss();

    TeamLeader teamLeader = new TeamLeader();

    boss.commandCheckNumber(teamLeader);

}

寫到這里,其實功能都已經實現,代碼看上去也沒什么問題。根據迪米特原則,Boss只想要結果,不需要跟Course直接交流。而TeamLeader統計需要引用Course對象。Boss和Course並不是朋友,從下面的類圖就可以看出來。

下面對代碼進行改造。

TeamLeader類的代碼如下:

public class TeamLeader {

    public void checkNumberOfCourses(){

        List<Course> courseList = new ArrayList<Course>();

        for(int i = 0 ;i < 20;i++){

            courseList.add(new Course());

        }

        System.out.println("目前已發布的課程數量是:"+courseList.size());

    }

}

Boss類的代碼如下:

public class Boss {

    public void commandCheckNumber(TeamLeader teamLeader){

        teamLeader.checkNumberOfCourses();

    }

}

再來看下面的類圖,Course和Boss已經沒有關聯了。

學習軟件設計原則,千萬不能形成強迫症。碰到業務復雜的場景,我們需要隨機應變。

關注微信公眾號『 Tom彈架構 』回復“設計模式”可獲取完整源碼。

【推薦】Tom彈架構:30個設計模式真實案例(附源碼),挑戰年薪60W不是夢

本文為“Tom彈架構”原創,轉載請注明出處。技術在於分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力。關注微信公眾號『 Tom彈架構 』可獲取更多技術干貨!

其他設計原則

Tom彈架構:開閉原則(Open-Closed Principle,OCP)

Tom彈架構:依賴倒置原則(Dependence Inversion Principle,DIP)

Tom彈架構:單一職責原則(Simple Responsibility Pinciple,SRP)

Tom彈架構:接口隔離原則(Interface Segregation Principle, ISP)

Tom彈架構:里氏替換原則(Liskov Substitution Principle,LSP)

Tom彈架構:合成復用原則(Composite/Aggregate Reuse Principle,CARP)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM