设计模式六大原则之迪米特法则讲解
最近学习设计模式六大原则,简单记录一下学习内容,方便以后复习查阅,如有理解的不对请评论指正。设计模式可以简单理解为面向对象语言开发过程中,遇到各种场景和问题,解决方案和思路。设计模式六大原则为:单一职责原则、里氏替换原则、迪米特法则、依赖倒置原则、接口隔离原则、开闭原则。
什么是迪米特原则?
迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public方法,不对外泄露任何信息。
迪米特法则还有个更简单的定义:只与直接的朋友通信,不与间接朋友通信。
直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。
一个对象应该对其他对象保持最少的了解。
实例代码讲解
本例用学校、班级、学生作为实例进行讲解,符合迪米特原则的思路学校可以管理班级、班级可以管理学生。但是一般来讲学校管理学生也是可以的,不过这样就违背了迪米特法则了。因为,可以这么理解学校跟班级是直接朋友,班级跟学生是直接朋友,学校跟学生就是间接朋友了。
代码如下:
学校类:
public class School { public int Id { get; set; } public string SchoolName { get; set; } public List<Class> ClassList { get; set; }//直接朋友 public void Manage() { Console.WriteLine($"Manage{this.GetType().Name}"); foreach (Class c in this.ClassList) { Console.WriteLine($"{c.GetType().Name} Manage {c.ClassName}"); c.Manage();//班级自己管理学生 //违背迪米特法则 List<Student> studentList = c.StudentList;//找到学生,学校管理 foreach (Student student in studentList) { Console.WriteLine($"{student.GetType().Name} Manage {student.StudentName}"); } } } }
班级类:
public class Class { public int Id { get; set; } public string ClassName { get; set; } public List<Student> StudentList { get; set; } public void Manage() { foreach (Student student in StudentList) { Console.WriteLine($"{student.GetType().Name} Manage {student.StudentName}"); } } }
学生类:
public class Student { public int Id { get; set; } public string StudentName { get; set; } }
猜您可能还喜欢
评论列表
发表评论
文章分类
文章归档
- 2025年3月 (1)
- 2024年6月 (2)
- 2024年5月 (2)
- 2024年4月 (4)
- 2024年3月 (30)
- 2024年1月 (4)
- 2023年12月 (2)
- 2023年11月 (4)
- 2023年10月 (4)
- 2023年9月 (6)
- 2023年3月 (2)
- 2023年2月 (1)
- 2023年1月 (1)
- 2022年12月 (1)
- 2022年9月 (21)
- 2022年8月 (10)
- 2022年7月 (3)
- 2022年4月 (1)
- 2022年3月 (13)
- 2021年8月 (1)
- 2021年3月 (1)
- 2020年12月 (42)
- 2020年11月 (7)
- 2020年10月 (5)
- 2020年8月 (1)
- 2020年6月 (1)
- 2020年3月 (2)
- 2019年12月 (8)
- 2019年11月 (3)
- 2019年9月 (1)
- 2019年4月 (1)
- 2019年3月 (6)
- 2019年2月 (1)
- 2018年7月 (7)
阅读排行
- 1.asp.net mvc内微信pc端、H5、JsApi支付方式总结(5703)
- 2.各大搜索网站网站收录提交入口地址(3202)
- 3.Windows 10休眠文件更改存储位置(3167)
- 4.ECharts仪表盘实例及参数使用详解(3096)
- 5.windows 10安装myeclipse 10破解补丁cracker.jar、run.bat闪退解决办法(2995)
- 6.HTML5 WebSocket与C#建立Socket连接实现代码(2867)
- 7.华为鸿蒙系统清除微信浏览器缓存方法(2793)
- 8.CERT_HAS_EXPIRED错误如何解决(2261)
- 9.Js异步async、await关键字详细介绍(lambda表达式中使用async和await关键字)(2192)
- 10.HBuilder编辑器格式化代码(2120)