設計模式 迪米特法則
只和朋友交流
Only talk to your immediate friends 只與直接的朋友通信。即每個對象都有耦合關係,對象之間有耦合。
定義老師類
public class Teacher{ // 老師對學生發布命令,清點學生 public void commond(GroupLeader groupLeader){ List listGirls = new ArrayList(); // 初始化學生 for(int i = 0; i < 20; i++){ listGirls.add(new Girl()); } // 然後進行查詢任務 groupLeader.countGirls(listGirls); }}然後定義體育文員,清查學生
public class GroupLeader{ // 查詢數量 public void countGirls(List listGirls){ }}定義學生類
public class Girl{}最後定義場景
public class Client{ public static void main(String[] args){ Teacher teacher = new Teacher(); // 發布命令 teacher.commond(new GroupLeader()); }}上方代碼的問題,Teacher類有一個朋友類,即GroupLeader,並且Girl類出現在commond方法體內,不屬於朋友類。
朋友類:出現在成員變量,方法的輸入參數中的類稱為成員朋友類,出現在方法內部的類不屬於朋友類,
迪米緹法則 一個類,只和朋友交流。不能和非朋友交流。但是剛剛定義的commond於Girl類有交流,即聲明了List數組,即與陌生的Girl類有交流
修改如下
修改後的老師類
public class Teacher{ // 老師對學生發布命令 public void commond(GroupLeader groupLeader){ // 告訴體育委員進行清查任務 groupLeader.countGirls(); }}體育委員
public class GroupLeader{ private List listGirls; // 將全班學生帶入,通過此構造函數Girl產生聯繫 public GroupLeader(List _listGirls){ this.listGirls = _listGirls; } // 進行學生數量的清理 public void countGirls(){ System.out.println(" " + this.listGirls.size()); }}定義場景
public class Client{ public static void main(String[] args){ List listGirls = new ArrayList(); // 創建一個群體列表 // 對學生初始化 for(int i = 0; i < 20; i++){ listGirls.add(new Girl()); } Teacher teacher = new Teacher(); // 發布命令 teacher.commond(new GroupLeader(listGirls)) }}總結, 類與類之間的關係是建立在類之間,一個方法中不要引入一個類中不存在的對象。
朋友間有距離
一個軟體安裝的過程
first定義第一步,second定義第二步,third定義第三 步。
public class Wizard{ private Random rand = new Random(); // 第一步 public int first(){ } // 第二步 public int third(){ } // 第三步 public int third(){ }}最後定義installSoftware
public class installSoftware{ public void installWizard(Wizard wizard){ int first = wizard.first(); int second = wizard.second(); int third = wizard.third(); }}最後定義場景
public class Client{ public static void main(String[] args){ installSoftware invoker = new installSoftware(); invoker.installWizard(new Wizard()); }}根據迪米特法則,兩個類之間知道的越少越好,Wizard類的太多方法被installSoftware使用,兩者的關係過於親密,修改後如下
public class Wizard{ private Random rand = new Random(); private int first(){ } private int second(){ } privaet int third(){ } // 對外只提供了一個installWizard方法 public void installWizard(){ int first = this.first(); int second = this.second(); int third = this.third(); }}public class insatllSoftware{ public void installWizard(Wizard wizard){ wizard.installWizard(); // 兩個類通過此方法連接 }}場景類
public class Client{ public static void main(String[] args){ installSoftward invoker = new installSoftware(); invoker.installWizard(new Wizard()); }}是自己的就是自己的
如果一個方法放在本類中,即不增加類間關係,也不會對本類不產生負面影響,那就放置在本類中。