設計模式七大原則-迪米特法則

迪米特法則(Demeter Principle)

基本介紹:

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

示例

public class Demeter1 {
    public static void main(String[] args) {
        SchoolManager schoolManager=new SchoolManager();
        schoolManager.printAllEmployee(new CollegeManager());
    }
}
//學校總部員工
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 CollegeManager{
    //返回學院的所有員工
    public List<CollegeEmployee> getAllEmployee(){
        List<CollegeEmployee> list=new ArrayList<>();
        for (int i = 0; i < 10 ; i++) {//這裏增加了10各員工到list
            CollegeEmployee emp=new CollegeEmployee();
            emp.setId("學院員工id="+i);
            list.add(emp);
        }
        return list;
    }
}
//學校管理類
//分析SchoolManager 類的直接朋友類有哪些Employee、CollegeManager
//CollegeEmployee 不是直接朋友,這樣違背了迪米特法則
class SchoolManager{
    public List<Employee> getAllEmployee(){
        List<Employee> list=new ArrayList<>();
        for (int i = 0; i < 5 ; i++) {
            Employee emp=new Employee();
            emp.setId("學校總部員工id="+i);
            list.add(emp);
        }
        return list;
    }
    //該方法完成輸出學校總部和員工信息(id)
    void printAllEmployee(CollegeManager sub){
        //分析問題
        //1、這裏CollegeEmployee不是SchoolManager的直接朋友
        //2、CollegeEmployee是以局部變量的方式出現在SchoolManager
        //3、違反了迪米特法則

        //獲取到學院員工
        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());
        }
    }
}

改進後

public class Demeter1 {
    public static void main(String[] args) {
        System.out.println("~~~使用迪米特法則改進~~~");
        SchoolManager schoolManager=new SchoolManager();
        schoolManager.printAllEmployee(new CollegeManager());
    }
}

//學校總部員工
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 CollegeManager{
    //返回學院的所有員工
    public List<CollegeEmployee> getAllEmployee(){
        List<CollegeEmployee> list=new ArrayList<>();
        for (int i = 0; i < 10 ; i++) {//這裏增加了10各員工到list
            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<>();
        for (int i = 0; i < 5 ; i++) {
            Employee emp=new Employee();
            emp.setId("學校總部員工id="+i);
            list.add(emp);
        }
        return list;
    }
    //該方法完成輸出學校總部和員工信息(id)
    void printAllEmployee(CollegeManager sub){
        //分析問題
        //1、將輸出學院的員工方法,封裝到CollegeManager類裏
        sub.printEmployee();
        //獲取到學校總部員工
        List<Employee> list2=this.getAllEmployee();
        System.out.println("----------學校總部員工------------");
        for (Employee e : list2) {
            System.out.println(e.getId());
        }
    }
}

總結:

  • 迪米特法則核心是降低類之間的耦合
  • 但是注意:由於每個類都減少了不必要的依賴,因此迪米特法則只是要求降低類間(對象間)耦合關係,並不是要求完全沒有依賴關係
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章