迪米特法则(Law of Demeter) 简介
在Java里class設(shè)計(jì)經(jīng)常會(huì)提到一些個(gè)原則或者規(guī)則
最出名的莫非是 封閉-開放原則了(closed-open principle)
而這次這個(gè) Law of Demeter 也是挺重要的.
一, 迪米特法則(Law of Demeter)的定義
迪米特法則(Law of Demeter)又叫作最少知識(shí)原則(Least Knowledge Principle 簡寫LKP),就是說一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能少的了解,不和陌生人說話。英文簡寫為: LoD.
解釋:
通常只看定義是不能理解的...
我們可以把這個(gè)法則分拆性兩點(diǎn).
1. 類設(shè)計(jì)中, 盡量降低成員的訪問權(quán)限(最低是Private)
2. 類A 假如 不認(rèn)識(shí) 類B, 那么類B不能直接訪問類A的方法.
3. 假如類B要訪問類A,? 那么類B可以借組 第三個(gè)類C來實(shí)現(xiàn),? ( 類C是類A認(rèn)識(shí)的類).
二,一個(gè)例子
例如我們可以找聯(lián)通客服mm來查詢手機(jī)月費(fèi)信息.
但是我們不能直接找聯(lián)通的客服人員, 因?yàn)槲覀儧]有聯(lián)通客服的私人號(hào)碼.
這樣則說明, 聯(lián)通客服人員的服務(wù)方法不是Public的, 一般人不能直接訪問.
SupportMM: 位于service包內(nèi)
package lawOfDemeter.service;import lawOfDemeter.Customer;public class SupportMM {private String name;protected SupportMM(String name){this.name = name;}protected void service(Customer c){System.out.println("Hello i am " + this.name);}
}
可見她的構(gòu)造函數(shù)和service方法都是包內(nèi)訪問的.
CustomerService: 位于service包內(nèi)
這個(gè)是客服類.
客服類與客服MM類處于同1個(gè)包內(nèi),
客服類有個(gè)查找空閑mm的方法, 并且讓空閑的mm去接客.
但是客服的service方法是對(duì)外的(public)
也就說所有客戶都可以直接訪問客服.
Customer: 位于service包外
由于在包外, 所以Customer是不能直接訪問SupportMM的package lawOfDemeter;import lawOfDemeter.service.*; public class Customer {public void askHelp(){CustomerService.service(this);} }
但是它可以通過客服來間接獲得supportMM的服務(wù).
UML:
三,小結(jié)
上面的那個(gè)例子是符合law of demeter的
它有什么優(yōu)點(diǎn)呢.
就是當(dāng)我們修改supportMM的內(nèi)容時(shí),? customer并不會(huì)受到任何影響.
也就是 松耦合的好處.
其實(shí)所有設(shè)計(jì)模式的目的無非兩點(diǎn):
1. 另業(yè)務(wù)思路更加清晰
2. 便于修改和擴(kuò)展
總結(jié)
以上是生活随笔為你收集整理的迪米特法则(Law of Demeter) 简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模板方法模式(TemplateMetho
- 下一篇: 外观模式(Facade) - 为系统分层