Java设计模式中的七大原则详细讲解

 更新时间:2023年02月17日 14:46:47   作者:非凡的小笨鱼  
本篇文章主要对Java中的设计模式如,创建型模式、结构型模式和行为型模式以及7大原则进行了归纳整理,需要的朋友可以参考下,希望能给你带来帮助

设计模式要进行共性与可变性的分析,对共性进行抽象,同时对可变性进行封装,没有完美的设计模式,作为一名开发者要懂得取舍,触类旁通,开发出高内聚、低耦合、灵活性更高的软件产品

1.开闭原则(软件设计第一原则) 

定义:一个软件实体应该对扩展开放,对修改关闭,即在不修改源代码的基础上扩展软件功能

本质思想:

  • 以抽象来固定不变的东西(把固定不变的抽出来)
  • 使用具体实现对可变性进行封装/隐藏
  • 面向抽象编程

2.依赖倒置原则

开闭原则是目标,依赖倒置是手段

三层含义:

  • 高层模块不应该依赖于低层模块,两者都应该依赖其抽象(例如一个类的成员变量、方法的入参、返回值不应该是一个具体类,而最好是一个抽象类)
  • 抽象不应该依赖细节(业务代码不关心具体类)
  • 细节应该依赖抽象(业务代码只关心抽象类)

依赖倒置原则的核心就是面向抽象(抽象类或者接口)编程

3.里氏替换原则

定义:在一个软件产品中,父类对象可以出现的地方,都可以替换成它的子类对象,且不能发生错误和异常,里氏替换原则为良好的继承定义了规范

四层含义:

  • 子类必须完全实现父类的抽象方法,但不能覆盖(重写)父类的非抽象方法
  • 子类可以增加自己特有的方法
  • 当子类一定要重写父类的方法时,子类方法的形参(前置条件)要比父类更宽松(例如父类使用HashMap,子类使用Map)
  • 当子类实现父类的抽象方法时,方法的返回值(后置条件)要比父类更加严格

总结:子类可以扩展父类的功能,但是不能去改变父类原有的功能(遵循父类原有的基础特性,进行一系列的行为变化)

4.合成复用原则

定义:在软件复用时,要尽量使用组合/聚合(has a)等关联关系来实现,即组合/聚合优先于继承

如果要使用继承关系,则必须严格遵循里氏替换原则

合成复用原则和里氏替换原则是相辅相成的,两者都是开闭原则的具体实现规范

设计模式用继承对行为变化进行分类,而不是使用继承来复用逻辑

  • 继承破坏了类的封装性,父类的实现细节全都暴露给子类了
  • 父类和子类的耦合性太高,父类的修改直接影响子类
  • 继承是静态的,与IOC动态注入相违背

5.接口隔离原则

定义:使用多个专门的接口,而不是使用单一的总接口;客户端调用者代码不应该依赖它不需要的接口

使用原则:

  • 根据接口隔离原则拆分接口时,首先必须满足单一职责原则
  • 提高高内聚(每个接口都只负责相互独立的部分,方法间都是强相关的)
  • 定制服务
  • 接口设计要有限度(不要让类过于膨胀)

目标:在发生代码变更,接口变更的情况下,尽量做到影响程度最低

6.迪米特法则

  • 规则:一个类应该尽量少的对其他类相互作用(依赖/调用)
  • 解释:只与直接朋友(私有成员变量、方法入参、new的对象)进行通信,间接朋友:调用直接朋友的方法获取到的对象
  • 目的:让类之间解耦,提高类的复用性,当其他类发生变更的时候,对这个类的影响才最小
  • 缺点:过于严格的遵守此原则,会导致系统产生大量透明的小方法,需要在朋友数量和小方法之间进行权衡

通过下面的例子加深理解,Person类想调用Stranger类执行一些逻辑

public class Person {
    private Friend friend = null;
    // 遵循迪米特法则
    // 将Stranger类封装/隐藏了,Person类不知道Stranger类的存在
    // 但是Friend类产生了callStrangerDoSomething这个透明的小方法
    public void right(){
        friend.callStrangerDoSomething();
    }
    // 不遵循迪米特法则
    // 与Stranger类耦合了
    public void wrong(){
        Stranger stranger = friend.getStranger();
        stranger.doSomething();
    }
}

7.单一职责原则

  • 单一职责原则要求一个接口或类只有一个原因引起变化(职责的范围因人而异)
  • 一个接口或一个类只负责一件明确的事,负责的事情越少越好
  • 如果其他类依赖了一个包含多个职责的类,也会将不需要的职责包含进来,也违反了迪米特法则

到此这篇关于Java设计模式中的七大原则详细讲解的文章就介绍到这了,更多相关Java设计模式原则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis中的高级映射一对一、一对多、多对多

    Mybatis中的高级映射一对一、一对多、多对多

    这篇文章主要介绍了Mybatis中的高级映射一对一、一对多、多对多的相关资料,需要的朋友可以参考下
    2016-08-08
  • Java BIO,NIO,AIO总结

    Java BIO,NIO,AIO总结

    这篇文章主要介绍了Java BIO,NIO,AIO的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • springboot集成fastDfs过程代码实例

    springboot集成fastDfs过程代码实例

    这篇文章主要介绍了springboot集成fastDfs过程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Mybatis中关于自定义mapper.xml时,参数传递的方式及写法

    Mybatis中关于自定义mapper.xml时,参数传递的方式及写法

    这篇文章主要介绍了Mybatis中关于自定义mapper.xml时,参数传递的方式及写法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 关于Spring @Transactional事务传播机制详解

    关于Spring @Transactional事务传播机制详解

    我们日常工作中极少使用事务传播级别,单纯只是使用事务和rollbackfor抛出异常来解决事务问题,但其实我们很多时候使用的是不正确的,或者说会造成事务粒度过大,本文详解一下事务传播级别,也让自己更好地处理事务问题,需要的朋友可以参考下
    2023-08-08
  • Java的Arrays.sort()方法排序算法实例分析

    Java的Arrays.sort()方法排序算法实例分析

    网上看过很多JDK8中Arrays.sort的底层原理,有些说是插入排序,有些说是归并排序,也有说大于域值用计数排序法,否则就使用插入排序,这种说法到底对吗?下面通过本文给大家分析下Java的Arrays.sort()方法到底用的什么排序算法,感兴趣的朋友一起看看吧
    2022-02-02
  • elasticsearch聚合查询实践示例

    elasticsearch聚合查询实践示例

    这篇文章主要为大家介绍了elasticsearch聚合查询实践示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • java后台调用接口及处理跨域问题的解决

    java后台调用接口及处理跨域问题的解决

    这篇文章主要介绍了java后台调用接口,处理跨域的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java 多线程实例讲解(一)

    Java 多线程实例讲解(一)

    本文主要介绍Java 多线程的知识,这里整理了详细的资料及简单示例代码有需要的小伙伴可以参考下
    2016-09-09
  • 老生常谈spring boot 1.5.4 日志管理(必看篇)

    老生常谈spring boot 1.5.4 日志管理(必看篇)

    下面小编就为大家带来一篇老生常谈spring boot 1.5.4 日志管理(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论