我的博客原文:
迪米特法則java
設計模式六大原則之五:迪米特法則。
姓名:迪米特法則git
英文名:Law of Demetergithub
小名:最少知識原則設計模式
小名英文名:Least Knowledge Principleapp
價值觀:媽媽說不和陌生人說話學習
我的介紹:this
(來自維基百科)spa
仍是腦洞大開來個小故事。這故事仍是比較現實一些,其實也不算是故事,就是我們常常經歷的事情,如今知識付費已經廣受歡迎,18 年末更是快速猛漲,各類各樣的培訓、讀書、音頻學習軟件如雨後春筍通常涌現出來。咱們就拿一個讀書的例子。設計
有一天,設計模式老師講解了迪米特法則,同窗們聽得雲裏霧裏的,老師怕同窗們沒掌握這個知識點,就給同窗們佈置了一個做業,須要同窗們按迪米特法則實現。code
做業是這樣子的:日常在零碎的時間裏,喜歡看一些書籍,通常都是電子書,如今咱們看書的操做是這樣的:喚醒手機,打開閱讀軟件,選擇書籍,而後閱讀。總共 3 個步驟,涉及了 3 樣東西:手機、軟件、書籍。同窗們用代碼實現這個過程。
次日上課,同窗們紛紛交了做業,老師隨手一番,就看到了 2 個鮮明的例子,很明顯,就是一好一壞。老師便給同窗們講解了這 2 個例子,讓學生感覺一番迪米特法則。
public class LODErrorTest { public static void main(String[] args) { Phone phone = new Phone(); phone.readBook(); } } /** * 錯誤的示範 */ class Phone { App app = new App(); Book book = new Book("設計模式"); public void readBook() { app.read(book); } } class App { public void read(Book book) { System.out.println(book.getTitle()); } } class Book { private String title; public Book(String title) { this.title = title; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
代碼:
LODErrorTest
代碼是完成了讀書這個過程,看樣子是功能實現了,細看會發現代碼的邏輯不對。哪裏不對呢?書籍和應用對象都在手機上,現實是咱們喚醒手機,這時手機是沒有書籍的,只有當咱們打開閱讀軟件,纔有書籍能夠看,沒有閱讀軟件,書籍是看不了的。所以,手機和書籍沒有一毛錢關係,書籍不該該在手機裏面。正常的設計是:手機裏面有閱讀軟件,閱讀軟件裏面有書籍,這才符合迪米特法則,按定義來講:手機和閱讀軟件是朋友,閱讀軟件和書籍是朋友,但是朋友的朋友不是朋友,也就是手機和書籍不是朋友,因此它們不該該有交集,應該離得遠遠的。
思考一下現實:工做中若是缺乏代碼複覈這個步驟,就會出現這樣子,後果是怎麼樣呢?會給後人挖坑,並且是大坑,由於和現實中的邏輯是對不上的,何況後人不知道當時的業務背景,只能看代碼去熟悉,就會一步錯、步步錯,因此要好好把控代碼質量這一關,由於代碼千人千面,無法要求代碼風格所有一致,但至少須要實現邏輯是清晰易懂的。
public class LODRightTest { public static void main(String[] args) { Phone2 phone2 = new Phone2(); phone2.readBook(); } } /** * 正確的示範 */ class Phone2 { private App2 app2 = new App2(); public void readBook() { app2.read(); } } class App2 { private Book2 book2 = new Book2("設計模式"); public void read() { System.out.println(book2.getTitle()); } } class Book2 { private String title; public Book2(String title) { this.title = title; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
代碼:
LODRightTest
這段代碼就符合迪米特法則,手機中有閱讀軟件,閱讀軟件中有書籍,手機沒有書籍任何影子。正確代碼不用細講,用心去感覺就能夠體會到。
迪米特法則主要講述的觀點是高內聚、低耦合。我理解爲:是你的,就別給別人;不是你的,就別拿。上面定義的朋友也是這個意思。
參考資料:《大話設計模式》、《Java設計模式》、《設計模式之禪》、《研磨設計模式》、《Head First 設計模式》
寫到這,第五個原則了,六大原則就剩下最後一個開閉原則,湊齊 6 把大刀就能夠準備去大幹 23 個大漢啦。。。想一想都激動。
但願文章對您有所幫助,設計模式系列會持續更新,感興趣的同窗能夠關注公衆號,第一時間獲取文章推送閱讀,也能夠一塊兒交流,交個朋友。