HTML5技术

详解设计模式六大原则 - 请叫我头头哥(5)

字号+ 作者:H5之家 来源:博客园 2015-10-20 09:22 我要评论( )

一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他

一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。

2.模拟场景: 

场景:公司财务总监发出指令,让财务部门的人去统计公司已发公司的人数。

一个常态的编程:(肯定是不符LoD的反例)

UML类图:

C# 迪米特法则

代码演示:

//------------------------------------------------------------------------------ // <copyright file="Dependency.cs" company="CNBlogs Corporation"> // Copyright (C) 2015-2016 All Rights Reserved 作 者: 请叫我头头哥 // </copyright> TestLibrary.ExtensionsClass { using System; using System.Collections.Generic; 财务总监 CFO { 财务总监发出指令,让财务部门统计已发工资人数 Directive(Finance finance) { List<Employee> employeeList = new List<Employee>(); (int i = 0; i < 500; i++) { employeeList.Add(new Employee()); } // 转告财务部门开始统计已结算公司的员工 finance.SettlementSalary(employeeList); } } 财务部 Finance { 统计已结算公司的员工 SettlementSalary(List<Employee> employeeList) { Console.WriteLine(, employeeList.Count)); } } 员工 Employee { } 主程序 Runner { main(String[] args) { CFO cfo = new CFO(); // 财务总监发出指令 cfo.Directive(new Finance()); } } }

根据模拟的场景:财务总监让财务部门总结已发工资的人数。 财务总监和员工是陌生关系(即总监不需要对员工执行任何操作)。根据上述UML图和代码解决办法显然可以看出,上述做法违背了LoD法则。

依据LoD法则解耦:(符合LoD的例子)

UML类图:

代码演示:

//------------------------------------------------------------------------------ // <copyright file="Dependency.cs" company="CNBlogs Corporation"> // Copyright (C) 2015-2016 All Rights Reserved 作 者: 请叫我头头哥 // </copyright> TestLibrary.ExtensionsClass { using System; using System.Collections.Generic; 财务总监 CFO { 财务总监发出指令,让财务部门统计已发工资人数 Directive(Finance finance) { // 通知财务部门开始统计已结算公司的员工 finance.SettlementSalary(); } } 财务部 Finance { private List<Employee> employeeList; Finance(List<Employee> _employeeList) { this.employeeList = _employeeList; } 统计已结算公司的员工 SettlementSalary() { Console.WriteLine(, employeeList.Count)); } } 员工 Employee { } 主程序 Runner { main(String[] args) { List<Employee> employeeList = new List<Employee>(); (int i = 0; i < 500; i++) { employeeList.Add(new Employee()); } CFO cfo = new CFO(); // 财务总监发出指令 cfo.Directive(new Finance(employeeList)); } } }

根据LoD原则我们需要让财务总监和员工之间没有之间的联系。这样才是遵守了迪米特法则。

v博客总结

想搞懂设计模式,必须先知道设计模式遵循的六大原则,无论是哪种设计模式都会遵循一种或者多种原则。这是面向对象不变的法则。本文针对的是设计模式(面向对象)主要的六大原则展开的讲解,并尽量做到结合实例和UML类图,帮助大家理解。在后续的博文中还会跟进一些设计模式的实例。

 


作  者:请叫我头头哥
出  处:
关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【】一下。您的鼓励是作者坚持原创和持续写作的最大动力!

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 设计模式(1)单例模式(Singleton) - Fonour

    设计模式(1)单例模式(Singleton) - Fonour

    2017-04-23 12:00

  • ASP.NET Core MVC 源码学习:详解 Action 的激活 - Savorboard

    ASP.NET Core MVC 源码学习:详解 Action 的激活 - Savorboard

    2017-04-14 13:04

  • EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗? - Jeffcky

    EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗? -

    2017-04-05 14:03

  • ASP.NET Core MVC 源码学习:详解 Action 的匹配 - Savorboard

    ASP.NET Core MVC 源码学习:详解 Action 的匹配 - Savorboard

    2017-03-30 18:02

网友点评
>