七大設(shè)計原則之迪米特法則
定義
迪米特法則(Law of Demeter,LoD)也稱為最少知識原則(Least Knowledge Principle,LKP)。
一個對象應該對其他對象有最少的了解。通俗地講,一個類應該對自己需要耦合或調(diào)用的類知道得最少,它的內(nèi)部是如何復雜都和自己沒關(guān)系,只需知道它提供的public方法,其他的一概不關(guān)心。
廣義的迪米特法則:
一個模塊設(shè)計的好壞的一個重要標志就是該模塊在多大程度上講自己的內(nèi)部數(shù)據(jù)與實現(xiàn)的有關(guān)細節(jié)隱藏起來。
一個軟件實體應當盡可能少的與其他實體發(fā)生相互作用。
每一個軟件單位對其他的單位都只有最少的知識,而且局限于那些與本單位密切相關(guān)的軟件單位。
目的
在于降低類與類之間的耦合。由于每個類盡量減少對其他類的依賴,因此,很容易使得系統(tǒng)的功能模塊功能獨立,是的相互間存在盡可能少的依賴關(guān)系。
優(yōu)點
迪米特法則的做法觀念就是類間解耦,弱耦合,只有弱耦合了以后,類的復用率才可以提高。
缺點
造成系統(tǒng)的不同模塊之間的通信效率降低,使系統(tǒng)的不同模塊之間不容易協(xié)調(diào)等缺點。
因為迪米特法則要求類與類之間盡量不直接通信,如果類之間需要通信就通過第三方轉(zhuǎn)發(fā)的方式,這就直接導致了系統(tǒng)中存在大量的中介類,大大增加了系統(tǒng)的復雜度。
解決這個問題的方式是:使用依賴倒轉(zhuǎn)原則(通俗的講就是要針對接口編程,不要針對具體編程), 這要就可以是調(diào)用方和被調(diào)用方之間有了一個抽象層,被調(diào)用方在遵循抽象層的前提下就可以自由的變化,此時抽象層成了調(diào)用方的朋友。
注意事項
第一:在類的劃分上,應當創(chuàng)建弱耦合的類,類與類之間的耦合越弱,就越有利于實現(xiàn)可復用的目標。
第二:在類的結(jié)構(gòu)設(shè)計上,每個類都應該降低成員的訪問權(quán)限。
第三:在類的設(shè)計上,只要有可能,一個類應當設(shè)計成不變的類。
第四:在對其他類的引用上,一個對象對其他類的對象的引用應該降到最低。
第五:盡量限制局部變量的有效范圍,降低類的訪問權(quán)限。
簡單示例:
上課時,教師讓學習委員進行點名
namespace DesignPrinciples.LowOfDemeter { class Program { static void Main(string[] args) { GroupLeader group = new GroupLeader(); Teacher teacher = new Teacher(); teacher.Command(group); Console.WriteLine("==== 我是分割線 ===="); teacher.CommandByDemeter(group); } } public class Teacher { /// <summary> /// 教師發(fā)送命令 /// </summary> /// <param name="group"></param> public void Command(GroupLeader group) { List<Student> students = new List<Student>(); for (int i = 0; i < 20; i++) { students.Add(new Student()); } group.Count(students); } public void CommandByDemeter(GroupLeader group) { group.CountByDemeter(); } } public class GroupLeader { /// <summary> /// 學習委員點名 /// </summary> /// <param name="girls"></param> public void Count(List<Student> girls) { Console.WriteLine("學生人數(shù):" + girls.Count); } public void CountByDemeter() { List<Student> students = new List<Student>(); for (int i = 0; i < 20; i++) { students.Add(new Student()); } Console.WriteLine("學生人數(shù)(迪米特):" + students.Count); } } public class Student { public string Name { get; set; } } }
參考:
http://www.rzrgm.cn/wisdo/p/4178723.html
歡迎閱讀本系列文章:Head First設(shè)計模式之目錄

浙公網(wǎng)安備 33010602011771號