迪米特原则
迪米特法则的核心是为了降低类之间的耦合,即一个类对自己所依赖的类知道的越少越好(也称最少知道原则),要求被依赖的类尽量对外只提供public方法供依赖类来使用即可,不泄露任何的被依赖类的信息,从而实现高内聚,低耦合的效果。
迪米特法则的基本介绍:
下面直接给出未实现迪米特法则的案例和实现迪米特法则的案例。
未实现迪米特法则的案例
package com.gaoliwei.demeter;
import java.util.ArrayList;
import java.util.List;
public class Demeter {
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<CollegeEmployee>();
for (int i = 0; i < 10; i++){
CollegeEmployee collegeEmployee = new CollegeEmployee();
collegeEmployee.setId("学校员工id = " + i);
list.add(collegeEmployee);
}
return list;
}
}
//学校管理类
//分析SchoolManager类的直接朋友类有哪些? Employee、CollegeManager类
//不是直接朋友的类有哪些? CollegeEmployee类
//这样就违背了迪米特法则
class SchoolManager{
public List<Employee> getAllEmployee(){
List<Employee> list = new ArrayList<Employee>();
for (int i = 0; i < 5; i++){
Employee employee = new Employee();
employee.setId("学校总部员工:" + i);
list.add(employee);
}
return list;
}
public void printAllEmployee(CollegeManager collegeManager){
//分析问题
// 1.这里的CollegeEmployee 不是 SchoolManager的直接朋友
// 2.CollegeEmploy 是以局部变量方式出现在SchoolManager
// 3.违反了 迪米特法则
List<CollegeEmployee> list1 = collegeManager.getAllEmployee();
System.out.println("-----学院员工-----");
for (CollegeEmployee employee:list1){
System.out.println(employee.getId());
}
List<Employee> list2 = this.getAllEmployee();
System.out.println("-----学校总部员工-----");
for (Employee employee: list2){
System.out.println(employee.getId());
}
}
}
运行结果
-----学院员工-----
学校员工id = 0
学校员工id = 1
学校员工id = 2
学校员工id = 3
学校员工id = 4
学校员工id = 5
学校员工id = 6
学校员工id = 7
学校员工id = 8
学校员工id = 9
-----学校总部员工-----
学校总部员工:0
学校总部员工:1
学校总部员工:2
学校总部员工:3
学校总部员工:4
已实现迪米特法则的案例
package com.gaoliwei.demeter.improve;
import java.util.ArrayList;
import java.util.List;
public class Demeter {
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<CollegeEmployee>();
for (int i = 0; i < 10; i++){
CollegeEmployee collegeEmployee = new CollegeEmployee();
collegeEmployee.setId("学校员工id = " + i);
list.add(collegeEmployee);
}
return list;
}
//添加printAllEmployee方法,输出学院员工的所有信息
public void printAllEmployee(){
List<CollegeEmployee> list1 = this.getAllEmployee();
System.out.println("-----学院员工-----");
for (CollegeEmployee employee:list1){
System.out.println(employee.getId());
}
}
}
//学校管理类
class SchoolManager{
public List<Employee> getAllEmployee(){
List<Employee> list = new ArrayList<Employee>();
for (int i = 0; i < 5; i++){
Employee employee = new Employee();
employee.setId("学校总部员工:" + i);
list.add(employee);
}
return list;
}
public void printAllEmployee(CollegeManager collegeManager){
collegeManager.printAllEmployee();
List<Employee> list2 = this.getAllEmployee();
System.out.println("-----学校总部员工-----");
for (Employee employee: list2){
System.out.println(employee.getId());
}
}
}
运行结果
~~~~~实现迪米特法则~~~~~
-----学院员工-----
学校员工id = 0
学校员工id = 1
学校员工id = 2
学校员工id = 3
学校员工id = 4
学校员工id = 5
学校员工id = 6
学校员工id = 7
学校员工id = 8
学校员工id = 9
-----学校总部员工-----
学校总部员工:0
学校总部员工:1
学校总部员工:2
学校总部员工:3
学校总部员工:4