七大設計原則之迪米特法則


定義

  迪米特法則(Law of Demeter,LoD)也稱為最少知識原則(Least Knowledge Principle,LKP)。

  一個對象應該對其他對象有最少的了解。通俗地講,一個類應該對自己需要耦合或調用的類知道得最少,它的內部是如何復雜都和自己沒關系,只需知道它提供的public方法,其他的一概不關心。

 廣義的迪米特法則:
    一個模塊設計的好壞的一個重要標志就是該模塊在多大程度上講自己的內部數據與實現的有關細節隱藏起來。
    一個軟件實體應當盡可能少的與其他實體發生相互作用。
    每一個軟件單位對其他的單位都只有最少的知識,而且局限於那些與本單位密切相關的軟件單位。

目的

  在於降低類與類之間的耦合。由於每個類盡量減少對其他類的依賴,因此,很容易使得系統的功能模塊功能獨立,是的相互間存在盡可能少的依賴關系。

優點

  迪米特法則的做法觀念就是類間解耦,弱耦合,只有弱耦合了以后,類的復用率才可以提高。

缺點

     造成系統的不同模塊之間的通信效率降低,使系統的不同模塊之間不容易協調等缺點。

   因為迪米特法則要求類與類之間盡量不直接通信,如果類之間需要通信就通過第三方轉發的方式,這就直接導致了系統中存在大量的中介類,大大增加了系統的復雜度。

  解決這個問題的方式是:使用依賴倒轉原則(通俗的講就是要針對接口編程,不要針對具體編程), 這要就可以是調用方和被調用方之間有了一個抽象層,被調用方在遵循抽象層的前提下就可以自由的變化,此時抽象層成了調用方的朋友。

 

注意事項

    第一:在類的划分上,應當創建弱耦合的類,類與類之間的耦合越弱,就越有利於實現可復用的目標。
    第二:在類的結構設計上,每個類都應該降低成員的訪問權限。
    第三:在類的設計上,只要有可能,一個類應當設計成不變的類。
    第四:在對其他類的引用上,一個對象對其他類的對象的引用應該降到最低。
    第五:盡量限制局部變量的有效范圍,降低類的訪問權限。

 簡單示例:

  上課時,教師讓學習委員進行點名

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>
        /// 教師發送命令
        /// </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("學生人數:" + girls.Count);
        }

        public void CountByDemeter()
        {
            List<Student> students = new List<Student>();
            for (int i = 0; i < 20; i++)
            {
                students.Add(new Student());
            }
            Console.WriteLine("學生人數(迪米特):" + students.Count);
        }
    }

    public class Student
    {
        public string Name { get; set; }
    }
}


 

參考:

http://www.cnblogs.com/wisdo/p/4178723.html

 

歡迎閱讀本系列文章:Head First設計模式之目錄

 


免責聲明!

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



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