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

基本介紹

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

案例分析

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,因此違反了迪米特法則code

改進代碼

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

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

一、迪米特法則的核心是下降類之間的耦合
二、因爲每一個類都減小了沒必要要的依賴,所以迪米特法則知識要求下降類間(對象間)耦合關係,並非要求徹底沒有依賴關係對象

相關文章
相關標籤/搜索