countGirls($listGirls);}}class GroupLeader {//有清查女生的工作public function countGirls($listGirls = array()){echo '女生的數量是:' . sizeof($listGirls);}}class Girl {}class Client {public static function doing() {$teacher= new Teacher();//老師發布命令$teacher -> commond(new GroupLeader());}}Client :: doing();class Teacher {public function commond(GroupLeader $groupLeader){//告訴體育委員開始執行清查任務$groupLeader -> countGirls();}}class GroupLeader {private $_listGirls = array();//傳遞全班的女生public function __construct($listGirls){$this -> _listGirls = $listGirls;}//有清查女生的工作public function countGirls(){echo "女生數量是:" . sizeof($this -> _listGirls);}}class Girl {}class Client {public static function doing() {//初始化女生for($i=0; $i<20; $i++){$listGirls[] = new Girl();}$teacher= new Teacher();//老師發布命令$teacher -> commond(new GroupLeader($listGirls));}}Client :: doing();
一個對象應該對其他對象瞭解最少。
迪米特法則的核心就是降低類鍵的耦合,從而提高類的複用性。
具體體現:
① 在類的劃分上,應該建立有弱耦合的類;
② 在類的結構設計上,每一個類都應當盡量降低成員的存取權限;
③ 在類的設計上,只要有可能,一個類應當設計成不變類;
④ 在對其他類的引用上,一個對象對其它對象的引用應當降到最低;
⑤ 盡量降低類的存取權限;
⑥ 謹慎使用序列化功能(類或介面在用戶端變更,卻未在服務端同步更新,引發序列化失敗,,專案管理易疏忽);
⑦ 不要暴露類成員,而應該提供相應的訪問器(屬性)。
迪米特法則主要運用在觀察者模式和中介者模式中
迪米特法則的缺點:
1、遵循類之間的迪米特法則會使一個系統的局部設計簡化,因為每個局部都不會與遠距離的對象有直接的關聯;但也會造成不同模組之間的通訊效率降低,會使系統的不同模組之間不容易協調。
2、在系統中造出大量的小方法,散落在系統的各個角落。這些方法僅傳遞間接的調用,與系統的商務邏輯無關。