迪米特法则(Law Of Demeter)
迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
迪米特法则不希望类之间建立直接的联系。
例如,
1)一般的反面设计实现
using System; using System.Collections.Generic; namespace ConsoleApplication { //学校总部员工类 class Employee { public string Id { get; set; } } //学院的员工类 class CollegeEmployee { public string Id { get; set; } } //管理学院员工的管理类 class CollegeManager { //返回学院的所有员工 public List<CollegeEmployee> getAllEmployee() { List<CollegeEmployee> list = new List<CollegeEmployee>(); //增加了10个员工到list for (int i = 0; i < 10; i++) { CollegeEmployee emp = new CollegeEmployee(); emp.Id="学院员工ID=" + i; list.Add(emp); } return list; } } //学校管理类 class SchoolManager { //返回学校总部的员工 public List<Employee> getAllEmployee() { List<Employee> list = new List<Employee>(); for (int i = 0; i < 5; i++) { Employee emp = new Employee(); emp.Id = "学校总部员工ID=" + i; list.Add(emp); } return list; } //该方法完成输出学校总部和学院员工信息(ID) public void PrintAllEmployee(CollegeManager sub) { //CollegeEmployee不是SchoolManager的直接朋友 //CollegeEmployee是以局部变量方式出现在SchoolManager违反了迪米特法则 //获取学院员工 List<CollegeEmployee> list1 = sub.getAllEmployee(); Console.WriteLine("===========学院员工=============="); foreach (CollegeEmployee e in list1) { Console.WriteLine(e.Id); } //获取学院总部员工 List<Employee> list2 = this.getAllEmployee(); Console.WriteLine("===========学院总部员工=============="); foreach (Employee e in list2) { Console.WriteLine(e.Id); } } } class Program { static void Main(string[] args) { //创建一个SchoolManager对象 SchoolManager schoolManager = new SchoolManager(); //输出学院的员工ID和学校总部的员工信息 schoolManager.PrintAllEmployee(new CollegeManager()); Console.ReadKey(); } } }
2)迪米特法则的实现
using System; using System.Collections.Generic; namespace ConsoleApplication { //学校总部员工类 class Employee { public string Id { get; set; } } //学院的员工类 class CollegeEmployee { public string Id { get; set; } } //管理学院员工的管理类 class CollegeManager { //返回学院的所有员工 public List<CollegeEmployee> getAllEmployee() { List<CollegeEmployee> list = new List<CollegeEmployee>(); //增加了10个员工到list for (int i = 0; i < 10; i++) { CollegeEmployee emp = new CollegeEmployee(); emp.Id = "学院员工ID=" + i; list.Add(emp); } return list; } //输出学院员工的信息 public void printEmployee() { //获取到学院员工 List<CollegeEmployee> list1 = getAllEmployee(); Console.WriteLine("===========学院员工=============="); foreach (CollegeEmployee e in list1) { Console.WriteLine(e.Id); } } } //学校管理类 class SchoolManager { //返回学校总部的员工 public List<Employee> getAllEmployee() { List<Employee> list = new List<Employee>(); for (int i = 0; i < 5; i++) { Employee emp = new Employee(); emp.Id = "学校总部员工ID=" + i; list.Add(emp); } return list; } //该方法完成输出学校总部和学院员工信息(ID) public void PrintAllEmployee(CollegeManager sub) { //将输出学院员工方法,封装到CollegeManager sub.printEmployee(); //获取学院总部员工 List<Employee> list2 = this.getAllEmployee(); Console.WriteLine("===========学院总部员工=============="); foreach (Employee e in list2) { Console.WriteLine(e.Id); } } } class Program { static void Main(string[] args) { //创建一个SchoolManager对象 SchoolManager schoolManager = new SchoolManager(); //输出学院的员工ID和学校总部的员工信息 schoolManager.PrintAllEmployee(new CollegeManager()); Console.ReadKey(); } } }