設計模式 迪米特法則
阿新 • • 發佈:2018-11-25
設計模式 迪米特法則
只和朋友交流
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());
}
}
是自己的就是自己的
如果一個方法放在本類中,即不增加類間關係,也不會對本類不產生負面影響,那就放置在本類中。