1. 程式人生 > >設計模式 迪米特法則

設計模式 迪米特法則

設計模式 迪米特法則

只和朋友交流

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());
    }
}

是自己的就是自己的

如果一個方法放在本類中,即不增加類間關係,也不會對本類不產生負面影響,那就放置在本類中。