java設計模式--迪米特法則

来源:https://www.cnblogs.com/windowsxpxp/archive/2020/01/10/12177954.html
-Advertisement-
Play Games

基本介紹 1、一個對象應該對其他對象保持最少的瞭解 2、類與類關係越密切,耦合度越大 3、迪米特法則又叫 最少知道原則 ,即一個類對自己依賴的類知道的越少越好。也就是說,對於被依賴的類不管多麼複雜,都儘量將邏輯封裝在類的內部。對外除了提供public方法,不對外泄露任何信息 4、迪米特法則還有個更簡 ...


基本介紹

1、一個對象應該對其他對象保持最少的瞭解
2、類與類關係越密切,耦合度越大
3、迪米特法則又叫最少知道原則,即一個類對自己依賴的類知道的越少越好。也就是說,對於被依賴的類不管多麼複雜,都儘量將邏輯封裝在類的內部。對外除了提供public方法,不對外泄露任何信息
4、迪米特法則還有個更簡單的定義:只與直接朋友通信
5、直接的朋友:每個對象都會與其他對象有耦合關係,只要兩個對象只有有耦合關係,我們就說這兩個對象之間是朋友關係。耦合的方式很多,依賴,關聯,組合,聚合等。其中,我們稱出現成員變數,方法參數,方法返回值中的類為直接的朋友,而出現在局部變數中的類不是直接的朋友。也就是說,陌生的類最好不要以局部變數的形式出現在類的內部。

案例分析

public class Demeter1 {
    public static void main(String[] args) {
        SchoolManager schoolManager = new SchoolManager();
        schoolManager.printAllEmployee(new CollegeManage());
    }
}

//總部員工的類
class Employee {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

//學院員工的類
class CollegeEmployee {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

//管理學院員工的類
class CollegeManage {
    // 返回學院的所有員工
    public List<CollegeEmployee> getAllEmployee() {
        List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
        for (int i = 0; i < 10; i++) {
            CollegeEmployee emp = new CollegeEmployee();
            emp.setId("學院員工id" + i);
            list.add(emp);
        }
        return list;
    }

    // 輸出學院員工的信息
    public void printEmployee() {
        // 獲取學院員工
        List<CollegeEmployee> list1 = this.getAllEmployee();
        System.out.println("------學院員工------");
        for (CollegeEmployee e : list1) {
            System.out.println(e.getId());
        }
    }

}

//管理學校員工的類
class SchoolManager {
    // 返回學校總部的所有員工
    public List<Employee> getAllEmployee() {
        List<Employee> list = new ArrayList<Employee>();
        for (int i = 0; i < 5; i++) {
            Employee emp = new Employee();
            emp.setId("學校總部員工" + i);
            list.add(emp);
        }
        return list;
    }

    void printAllEmployee(CollegeManage sub) {

        /*
         * 分析問題 1.這裡的CollegeEmployee 不是 SchoolManager的直接朋友 2.CollegeEmployee
         * 是以局部變數的方式出現在 SchoolManager 3.違反了迪米特法則
         */

        /*
         * 解決辦法 1.將輸出學院的員工方法,轉到CollegeEmployee
         */

        sub.printEmployee();

        // 獲取學校總部員工
        List<Employee> list2 = this.getAllEmployee();
        System.out.println("------學校總部員工------");
        for (Employee e : list2) {
            System.out.println(e.getId());
        }
    }
}

上面的代碼,CollegeEmployee 不是 SchoolManager的直接朋友,CollegeEmployee是以局部變數的方式出現在SchoolManager,所以違反了迪米特法則

改進代碼

public class Demeter1 {
    public static void main(String[] args) {
        SchoolManager schoolManager = new SchoolManager();
        schoolManager.printAllEmployee(new CollegeManage());
    }
}

//總部員工的類
class Employee {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

//學院員工的類
class CollegeEmployee {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

//管理學院員工的類
class CollegeManage {
    // 返回學院的所有員工
    public List<CollegeEmployee> getAllEmployee() {
        List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
        for (int i = 0; i < 10; i++) {
            CollegeEmployee emp = new CollegeEmployee();
            emp.setId("學院員工id" + i);
            list.add(emp);
        }
        return list;
    }
}

//管理學校員工的類
class SchoolManager {
    // 返回學校總部的所有員工
    public List<Employee> getAllEmployee() {
        List<Employee> list = new ArrayList<Employee>();
        for (int i = 0; i < 5; i++) {
            Employee emp = new Employee();
            emp.setId("學校總部員工" + i);
            list.add(emp);
        }
        return list;
    }

    void printAllEmployee(CollegeManage sub) {
        // 獲取學院員工
        List<CollegeEmployee> list1 = sub.getAllEmployee();
        System.out.println("------學院員工------");
        for (CollegeEmployee e : list1) {
            System.out.println(e.getId());
        }

        // 獲取學校總部員工
        List<Employee> list2 = this.getAllEmployee();
        System.out.println("------學校總部員工------");
        for (Employee e : list2) {
            System.out.println(e.getId());
        }
    }
}

迪米特法則應註意的事項和細節

1、迪米特法則的核心是降低類之間的耦合
2、由於每個類都減少了不必要的依賴,因此迪米特法則知識要求降低類間(對象間)耦合關係,並不是要求完全沒有依賴關係


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 為什麼觸發不了了? <button type="button" onclick="a()">button</button> 全形字元 全形空格可能在輸入的時候無意識觸發, 在 js 里基本沒有影響, 但是在 HTML 標簽裡面屬性之間可能就難以發現, 導致全形空格後面的屬性失效. 雖然全形字元 ...
  • 舊的模板消息將在 2020 年 1 月 10 號全面下架,也就是今天,不過貌似現在還可以用!!!我已經改好了,只不過還沒有上線,準備堅持到最後一天! 0、訂閱消息 簡單介紹一下訂閱消息的特點: 用戶授權就能發送訂閱消息,一次授權可下發一次信息,長期訂閱消息模板授權一次理論上可以無限下發消息 與舊模板 ...
  • 簡單點說,組件是要復用的,在很多地方都會調用。 如果data不是函數,而是屬性,就又可能會發生多個地方的相同組件操作同一個Data屬性,導致數據混亂。 而如果是函數,因為組件data函數的返回值是{屬性:屬性名},所以每次返回都會在堆空間創建一個新的空間,所以各個組件不會發生操作同一個數據,防止數據 ...
  • 沙箱 沙箱: 環境, 黑盒, 在一個虛擬的環境中模擬真實世界, 做實驗, 實驗結果和真實世界的結果是一樣, 但是不會影響真實世界 全局變數 var num=10; console.log(num+10); //沙箱 小環境 (function () { var num = 10; console.l ...
  • 導航守衛 一、全局導航守衛 1. 全局導航守衛,把方法給 router,只要路由發生改變跳轉都會觸發這個函數 2. 每個路由 都有一個 meta 3. 全局導航守衛分兩種: 1. 全局前置導航守衛:路由還沒有跳轉之前 2. 全局後置導航守衛:路由跳轉之後 3. to 和 from 都是 router ...
  • 路由的緩存 路由緩存是 Vue組件優化的一個重要方法 為什麼實現路由緩存? 為了 組件間 相互切換不會重覆載入數據,影響用戶體驗,我們通常需要將組件的數組實現緩存,當我們點過來,在點的時候會再次發送 ajax,想讓它發送之後把數據存起來。 我們需要,當我點擊的時候直接出來 <keep-alive> ...
  • ©Copyright 蕃薯耀 2020-01-10 https://www.cnblogs.com/fanshuyao/ 一、官網地址: https://github.com/blueimp/jQuery-File-Upload 二、使用文檔(參數說明) https://github.com/blu ...
  • 各位朋友 因 最近工作繁忙,小編停更了一段時間,快過年了,小編祝願 大家 事業有成 學業有成 快樂健康 2020開心過好每一天。從今天開始 我會抽時間把 Vue 的知識點補充完整,以及後期會帶給大家更完善的知識體系!!! 路由的按需載入(懶載入) 我們都知道 vue的路由是我們必學的,也是不可分離的 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...