设计模式总共有六大基本原则,统称为SOLID (稳定)原则,分别是S-单一职责原则(Single Responsibility Principle), O-开闭原则(Open closed Principle),L-里氏替换原则(Liskov Substitution Principle),L-迪米特法则(Law of Demeter),I-接口隔离原则(Interface Segregation Principle),D-依赖倒置原则(Dependence Invension Principle)。

L-迪米特法则(Law of Demeter)

一、定义

1) Each unit should have only limited knowledge about other units: only units "closely" related to the current unit. (一个类应该对自己需要耦合或调用的类知道的最少)

2) Each unit should only talk to its friends; don‘t talk to strangers.

3) Only talk to your immediate friends. (只和直接的朋友通信)

二、理解

迪米特法则,也称最少知识原则。一个类应该对自己需要耦合或调用的类知道的最少。通俗地来讲,就是一个类只关心自己调用类提供的方法(通常是public方法),对其他类的内部实现概不关心。

1) 从调用者的角度考虑,应只和直接的朋友交流。

什么是直接的朋友?即是,内部成员属性、方法的输入输出参数。方法内部的类不算是朋友类。以下代码中GroupLeader是Teacher的直接朋友类,方法内部的List不是朋友类。也就是与一个陌生的Girl类交流,这样就破坏了Teacher类的健壮性。

1 public classTeacher {2   //老师对学生发布命令,清一下女生

3   public voidcommond(GroupLeader groupLeader){4     List listGirls = newArrayList();5     //初始化女生

6     for(int i=0;i<20;i++){7       listGirls.add(newGirl());8     }9     //告诉体育委员开始执行清查任务

10     groupLeader.countGirls(listGirls);11   }12 }

修改代码如下:

public classTeacher {//老师对学生发布命令,清一下女生

public voidcommond(GroupLeader groupLeader){//告诉体育委员开始执行清查任务

groupLeader.countGirls();

}

}

修改后的groupleader类 :

public classGroupLeader {private ListlistGirls;//传递全班的女生进来

public GroupLeader(List_listGirls){this.listGirls =_listGirls;

}//清查女生数量

public voidcountGirls(){

System.out.println("女生数量是:"+this.listGirls.size());

}

}

修改后的场景类:

public classClient {public static voidmain(String[] args) {//产生一个女生群体

List listGirls = new ArrayList();//初始化女生

for(int i=0;i<20;i++){

listGirls.add(newGirl());

}

Teacher teacher= newTeacher();//老师发布命令

teacher.commond(newGroupLeader(listGirls));

}

}

总结,把Teacher类中的List的初始化,移动到场景类,并在GroupLeader中增加了对Girl的注入,避开了Teacher类对陌生类的访问,降低了系统的耦合性,提高了系统的健壮性。

2) 从被调用者的角度考虑,应对外暴露最少的属性或方法,暴露的方法越多,耦合性越强。

是自己的,就是自己的。如果一个方法,放在本类中,既不增加类间关系,也不会对本类产生负面影响,就放在本类中

迪米特法则要求类“羞涩”一点,尽量不要对外公布太多的public方法和非静态的public变量,尽量内敛,多使用private、package-private、protected等访问权限。

三、注意事项

迪米特法则要求类间解耦,但解耦是有限度的。类间解耦,弱耦合了,类的复用率才会高,其要求的结果是产生大量的中间类、跳转类,这样会增加系统的复杂度,同时也会给维护带来难度。所以,需要在两者之前反复权衡,既做到结构清晰,又做到低耦合高内聚。

在实际应用中,如果一个类跳转两次以上才能访问到另一个类,就需要想办法进行重构了,为什么是两次以上呢?因为一个系统的成功不仅仅是一个标准或是原则就能够决定的,有非常多的外在因素决定,跳转次数越多,系统越复杂,维护就越困难,所以只要跳转不超过两次都是可以忍受的,这需要具体问题具体分析。

学习资料:

《设计模式之禅》秦小波 著

python设计模式六大原则_学习设计模式 - 六大基本原则之迪米特法则(示例代码)...相关推荐

  1. python 列表自动排序_Python学习小技巧之列表项排序的示例代码分享

    这篇文章主要给大家介绍了Python学习小技巧之列表项排序的相关资料,文中介绍的非常详细,需要的朋友们可以参借鉴,下面跟着小编一起来学习学习吧. 本文介绍的是关于Python列表项排序的相关内容,分享 ...

  2. 设计模式大杂烩(24种设计模式的总结及学习设计模式的几点建议)

    设计模式大杂烩(24种设计模式的总结及学习设计模式的几点建议)模式分类 & 传送门 & 对比维度说明 设计原则: 设计模式(总纲) 创建型: 单例模式 简单工厂模式 工厂方法模式 抽象 ...

  3. python三大特征六大原则_设计模式-来玩魔王的咚!-51CTO博客

    每一个设计模式系统的命名.解释和评价了面向对象系统中一个重要的和重复出现的设计.这里面向对象划重点,意思是所有的设计模式都是针对面向对象的提出的. 设计模式的4个基本要素: 模式名称 问题 解决方案 ...

  4. python里氏替换原则_设计模式六大原则之里氏替换原则

    这是设计模式6 大原则系列的第二篇文章,附上前一篇文章地址:设计模式六大原则之单一职责原则.本文主要讲解设计模式的里氏替换原则. 肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其 ...

  5. 设计模式六大原则_设计模式—设计六大原则

    1. 单一职责原则(SRP) 定义:就一个类而言,应该仅有一个引起它变化的原因. 从这句定义我们很难理解它的含义,通俗讲就是我们不要让一个类承担过多的职责.如果一个类承担的职责过多,就等于把这些职责耦 ...

  6. 书读百遍其义自见 - 六大原则 23种设计模式

    作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ 天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄! 一.设计模式 设计模式一般分为三类:创建型模式.结构型模式. ...

  7. python三大特征六大原则_面向对象程序设计(Object Oriented Programming)的三大特性,六大原则...

    三大特性 封装.继承.多态性 拿简单工厂模式举例: namespace DesignMode_01 { // 计算基类 public class Operation { private double ...

  8. java六大原则_六大Java功能

    java六大原则 我花了无数小时来对不同的应用程序进行故障排除. 通过经验,我可以得出关于大多数开发人员应该远离的几个Java SE功能/ API的结论. 当我提到大多数开发人员时,我会想到常规的Ja ...

  9. [转自左潇龙的博客]设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)...

    原文地址:    https://www.cnblogs.com/zuoxiaolong/p/pattern26.html 作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本 ...

最新文章

  1. 用java代码实现Singleton_为什么在Java代码中实现Singleton模式(有时)被认为是Java世界中的反模式?...
  2. python数独解题器,Python中最短的数独求解器 – 它是如何工作的?
  3. Eclipse 用Hibernate Tools 生成 .hbm cfg.xml等文件
  4. html输入框数字无法读取,关于input无法获取小数点的问题!!!!-汗血宝马
  5. boost::histogram::detail::argument_traits用法的测试程序
  6. boost::hana::one用法的测试程序
  7. 2020各大网站rss订阅源地址_RSS订阅器inoreader一些使用心得
  8. spring boot示例_Spring Boot上的Spring社交示例,或者我如何停止担心和喜欢自动配置...
  9. linux配置usb主从_杂集:浅谈关于Mongodb数据库主从复制
  10. oracle 移动日志文件,Oracle数据库移动数据文件、日志文件和控制文件
  11. Python数模笔记-模拟退火算法(4)旅行商问题
  12. 看Kubernetes源码,学习怎么用Go实现调度队列
  13. Outlook替代Hotmail:社交很重要,但邮箱是根本
  14. 如何在Unity项目中添加语音识别?
  15. 计算机视觉入门(包含论文学习网址)
  16. RequireJS - 用法
  17. MVC中的ViewData、ViewBag和TempData
  18. 物流行业的大数据发展与应用
  19. js中的运算符操作顺序
  20. 《段永平投资问答录(上册)》读书笔记

热门文章

  1. uwp post php,在UWP應用程序使用PHP腳本
  2. 虚拟机nfs服务器的安装,linux 安装nfs服务器
  3. linux文件系统扩容操作步骤,仅供参考
  4. idea server日志乱码_windows下,Kiwi_Syslog日志服务器的搭建
  5. HTML DOM addEventListener()
  6. 你还在用虚拟机,win10自带的linux还有图形界面(小白教程)
  7. 序列生成_Excel中最快速地生成数字序列的方法
  8. 关于SQL server事务
  9. svn 同步备份的所有问题,亲测可用
  10. Docker与虚拟机技术