java面向对象设计原则之迪米特法则分析详解

 更新时间:2021年10月14日 09:52:50   作者:guoyp2126  
这篇文章主要为大家介绍了java面向对象设计原则之迪米特法则的示例分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,学有所得

概念

迪米特法则解决类与类之间耦合度问题,如果类A调用了B类的某一个方法,则这两个类就形成了一种紧耦合的方式,当B类这个方法发生变化时,一定会影响A类的执行结果。迪米特法则要求每一个类尽可能少的与其他类发生关系,也就是尽可能少的让其他类发生变化时,对其代码的执行结果产生的影响降到最低。

典型情况:A类调用B类的方法,B类和C类是一种关联关系,如果A类通过B类所持有的C类对象直接调用C类的方法,则A类和C类同时拥有强耦合的关系。代码如下:

public class B {
    public C c = new C();
}
public class C {
    public void fun()
    {
        //相关代码
    }
}
public class A {
    public void show(){
        B b = new B();
        b.c.fun();
    }
}

这种调用A和C之间形成一种强耦合,当C中fun代码发生变化时,一定会影响到A,不符合迪米特法则。按照迪米特法则的要求可修改为:

public class B {
    private C c = new C();
    public void fun(){
       c.fun(); 
    }
}
public class A {
    public void show(){
        B b = new B();
        b.fun();
    }
}

A和C代码完全脱耦,当C的fun代码发生变化时,只需要修改类B中fun代码;当A中业务逻辑发生变化时,需要修改B中fun代码,也只需修改B中代码,和C中代码无关。
迪米特法则又叫做最少知识原则(LKP),就是说,一个对象应当对其他对象有尽可能少的了解。通俗的讲“不和陌生人讲话,只和朋友交流”,上述示例中类A和类B是朋友,和类C是陌生人。

使用

迪米特法则解决了类之间耦合度问题,使得类与类之间的接口通讯变得简单,提高了可维护性,但同时也增加了调用层次和复杂度。但以下情况一定要使用迪米特法则规避风险。

1.使用第三方组件或者控件时,增加一个包装器的类,使得调用方和第三方组件完全脱耦,如桌面程序中使用XP style一组控件属于第三方控件,每个控件增加一个包装器类,无论什么时间,XP style控件不能使用时,如:免费突然变收费,我们只需要修改包装器类中代码即可。

2.对于预期会发生较大变化的模块,增加一个外观层,简化和稳定高层模块的调用关系,与不稳定部分脱耦。

3.对付团队新成员或代码质量较差程序员,增加一个外观层,避免因频繁的修改,造成整个程序挂掉。

拓展

1.意思就是降低各个对象之间的耦合,提高系统的可维护性;

2.迪米特法则是一种设计思想,不仅仅体现在对象与对象的之间的耦合度问题上,而是广泛应用到各种分层结构中层与层之间的关系,每个层之间形成一种隔离关系,调用无需了解层内部及更下一级层的调用关系。如MVP模式,P将M和V结合起来,使得M和V都可以独立的进行变化,任何一方的变化仅影响到P层代码的变化。

3.前端开发时使用独立出来的API就是迪米特法则的要求,如:

 var api = {
   adminLogin: (param) => post(apiBase+"/sys/login", param),
   userLogin: (param) => post(apiBase+"/sys/weblogin", param),
   }

页面调用时只需要调用api中定义的adminLogin方法,当后端定义的路劲名apiBase、方法名login发生变化时,只修改api即可,不会影响到调用页面的代码
4. 设计模式中对象适配器、代理模式、门面模式等均体现了迪米特法则的思想。

以上就是java面向对象设计原则之迪米特法则分析详解的详细内容,更多关于java面向对象设计原则的资料请关注脚本之家其它相关文章!

相关文章

  • 自定义一个异常类模板的简单实例

    自定义一个异常类模板的简单实例

    下面小编就为大家带来一篇自定义一个异常类模板的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • js中去除字符串中所有的html标签代码实例

    js中去除字符串中所有的html标签代码实例

    这篇文章主要介绍了js中去除字符串中所有的html标签代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Spring MVC 处理一个请求的流程

    Spring MVC 处理一个请求的流程

    Spring MVC是Spring系列框架中使用频率最高的部分。不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分。因此程序员一定要熟练掌握MVC部分。本篇博客简要分析Spring MVC处理一个请求的流程。
    2021-02-02
  • Windows环境下重启jar服务bat代码的解决方案

    Windows环境下重启jar服务bat代码的解决方案

    在Windows环境下部署java的jar包,若有多个服务同时启动,很难找到相应服务重启,每次都重启全部服务很麻烦,应用场景大多用于部署测试,今天给大家分享Windows环境下重启jar服务bat代码,感兴趣的朋友一起看看吧
    2023-08-08
  • SpringBoot+Redis实现接口防刷的示例代码

    SpringBoot+Redis实现接口防刷的示例代码

    在实际开发中,会出现用户多次点击发送请求,本文主要介绍了SpringBoot+Redis实现接口防刷的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • SpringCloud Eureka实现服务注册与发现

    SpringCloud Eureka实现服务注册与发现

    Eureka是一种基于REST(具像状态传输)的服务,主要用于AWS云中定位服务,以实现中间层服务器的负载平衡和故障转移。本文记录一个简单的服务注册与发现实例。感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Java实现插入公式到PPT的示例代码

    Java实现插入公式到PPT的示例代码

    PPT中可插入公式,用于放映时演示相关内容的论证、推算的依据。通过代码,我们可借助特定的工具来实现在PPT中的插入公式,本文将对此作详细介绍
    2022-07-07
  • SpringBoot+JWT实现注册、登录、状态续签流程分析

    SpringBoot+JWT实现注册、登录、状态续签流程分析

    这篇文章主要介绍了SpringBoot+JWT实现注册、登录、状态续签【登录保持】,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 解决Swagger修改请求对象字段文档不更新问题

    解决Swagger修改请求对象字段文档不更新问题

    这篇文章主要为大家介绍了解决Swagger修改请求对象字段文档不更新的问题,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • SpringMVC文件上传的配置实例详解

    SpringMVC文件上传的配置实例详解

    本文通过实例代码给大家介绍SpringMVC文件上传的配置相关内容,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-05-05

最新评论