学习设计模式 - 六大基本原则之迪米特法则

  设计模式总共有六大基本原则,统称为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. (只和直接的朋友通信)

  来源:https://en.wikipedia.org/wiki/Law_of_Demeter

 二、理解

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

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

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

 1 public class Teacher {
 2   //老师对学生发布命令,清一下女生
 3   public void commond(GroupLeader groupLeader){
 4     List listGirls = new ArrayList();
 5     //初始化女生
 6     for(int i=0;i<20;i++){
 7       listGirls.add(new Girl());
 8     }
 9     //告诉体育委员开始执行清查任务
10     groupLeader.countGirls(listGirls);
11   }
12 }

修改代码如下:

public class Teacher {
  //老师对学生发布命令,清一下女生
  public void commond(GroupLeader groupLeader){
    //告诉体育委员开始执行清查任务
    groupLeader.countGirls();
  }
}

修改后的groupleader类 :

public class GroupLeader {
  private List<Girl> listGirls;
  //传递全班的女生进来
  public GroupLeader(List<Girl> _listGirls){
    this.listGirls = _listGirls;
  }
  //清查女生数量
  public void countGirls(){
    System.out.println("女生数量是:"+this.listGirls.size());
  }
}

修改后的场景类:

public class Client {
  public static void main(String[] args) {
    //产生一个女生群体
    List<Girl> listGirls = new ArrayList<Girl>();
    //初始化女生
    for(int i=0;i<20;i++){
      listGirls.add(new Girl());
    }
    Teacher teacher= new Teacher();
    //老师发布命令
    teacher.commond(new GroupLeader(listGirls));
  }
}

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

    

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

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

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

 三、注意事项

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

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

学习资料:

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

  白话设计——浅谈迪米特法则

原文地址:https://www.cnblogs.com/timfruit/p/9501521.html

时间: 2024-10-10 16:21:07

学习设计模式 - 六大基本原则之迪米特法则的相关文章

设计模式六大原则:迪米特法则

目录: 设计模式六大原则:单一职责原则 设计模式六大原则:接口隔离原则 设计模式六大原则:依赖倒置原则 设计模式六大原则:里氏替换原则 设计模式六大原则:迪米特法则 设计模式六大原则:开闭原则 迪米特法则(LOD): 也叫最少知识原则.迪米特法则的定义是只与你的直接朋友交谈,不与"陌生人"说话.如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该应用.其目的是降低类之间的耦合度,提高模块的相对独立性. 迪米特法则中的朋友是指:当前对象本身.当前对象的成员对

学习设计模式 - 六大基本原则之单一职责原则

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

学习设计模式 - 六大基本原则之开闭原则

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

学习设计模式 - 六大基本原则之里氏替换原则

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

学习设计模式 - 六大基本原则之依赖倒置原则

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

设计模式六大基本原则

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢? 一. 生成对象的原始模式 假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性. var C

设计模式六大原则/接口设计六大原则 之 迪米特法则(转)

定义:一个对象应该对其他对象保持最少的了解.迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话.英文简写为: LoD. 目的:迪米特法则的初衷在于降低类之间的耦合.由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系. 迪米特法则不希望类之间建立直接的联系.如果真的有需要建立联系,也希望能通过它的友元类来

设计模式七大原则之迪米特法则

迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用 如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽力少的影响其他模块,扩展会相对容易.这是对软件实体之间通信的限制.迪米特法则要求限制软件实体之间通信的宽度和深度.迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系. 迪米特法则还有几种定义形式:不要和“陌生人”说话,只与你的直接朋友通信等.在迪米特法则中,对于一个对象,其“朋友”包括以下几类: (1)当前对象本身(this) (2)以参数形式传入到当前对象方

设计模式-六大原则(01)

单一职责原则 单一职责原则(Single Responsibility Principle,简称SRP)的英文原话是:there should nerver be moren than one reason for a class to change.意思是一个类,应当只有一个引起它变化的原因.即一个类应该只有一个职责.就一个类而言,应当值专注于做一件事且仅有一个引起变化的原因,这就是所谓的单一职责原则.该原则提出了对对象职责的一种理想期望,对象不应该承担太多职责,正如人不应该一心分为二用.唯有