天天看點

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

基本介紹

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 getAllEmployee() {

List list = new ArrayList();

for (int i = 0; i < 10; i++) {

CollegeEmployee emp = new CollegeEmployee();

emp.setId("學院員工id" + i);

list.add(emp);

}

return list;

}

// 輸出學院員工的資訊

public void printEmployee() {

// 擷取學院員工

List list1 = this.getAllEmployee();

System.out.println("------學院員工------");

for (CollegeEmployee e : list1) {

System.out.println(e.getId());

}

}

}

//管理學校員工的類

class SchoolManager {

// 傳回學校總部的所有員工

public List getAllEmployee() {

List list = new ArrayList();

for (int i = 0; i < 5; i++) {

Employee emp = new Employee();

emp.setId("學校總部員工" + i);

list.add(emp);

}

return list;

}

void printAllEmployee(CollegeManage sub) {

sub.printEmployee();

// 擷取學校總部員工

List 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 getAllEmployee() {

List list = new ArrayList();

for (int i = 0; i < 10; i++) {

CollegeEmployee emp = new CollegeEmployee();

emp.setId("學院員工id" + i);

list.add(emp);

}

return list;

}

}

//管理學校員工的類

class SchoolManager {

// 傳回學校總部的所有員工

public List getAllEmployee() {

List list = new ArrayList();

for (int i = 0; i < 5; i++) {

Employee emp = new Employee();

emp.setId("學校總部員工" + i);

list.add(emp);

}

return list;

}

void printAllEmployee(CollegeManage sub) {

// 擷取學院員工

List list1 = sub.getAllEmployee();

System.out.println("------學院員工------");

for (CollegeEmployee e : list1) {

System.out.println(e.getId());

}

// 擷取學校總部員工

List list2 = this.getAllEmployee();

System.out.println("------學校總部員工------");

for (Employee e : list2) {

System.out.println(e.getId());

}

}

}

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

1、迪米特法則的核心是降低類之間的耦合

2、由于每個類都減少了不必要的依賴,是以迪米特法則知識要求降低類間(對象間)耦合關系,并不是要求完全沒有依賴關系