迪米特法則(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());
}
}
}
總結:
- 迪米特法則核心是降低類之間的耦合
- 但是注意:由於每個類都減少了不必要的依賴,因此迪米特法則只是要求降低類間(對象間)耦合關係,並不是要求完全沒有依賴關係