1.java设计模式之七大设计原则和UML类图

xiaokantianse 2020-11-09 17:44:34
java 设计 模式 1.java 七大


设计模式的目的:

  • 代码重用性 (即:相同功能的代码,不用多次编写)
  • 可读性 (即:编程规范性, 便于其他程序员的阅读和理解)
  • 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)
  • 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)
  • 使程序呈现高内聚,低耦合的特性

1、单一职责原则

​ 对类来说的,即一个类应该只负责一项职责,对类进行拆分。如类 A 负责两个不同职责:职责 1,职责 2。当职责 1 需求变更而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 的粒度分解为 A1,A2,也可实现方法级别的单一职责

注意事项:

  • 降低类的复杂度,一个类只负责一项职责
  • 提高类的可读性,可维护性
  • 降低变更引起的风险
  • 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则

2、接口隔离原则

​ 客户端不应该依赖它不需要的接口,即 一个类对另一个类的依赖应该建立在最小的接口上(消除无用方法),对接口进行拆分,将多个接口的公共的部分抽象成父接口,子接口只有特有的方法,实现类不需要实现无效方法。A为类,B为接口的实现类,调用A的方法时,接口的实现类B为方法参数(用到B类),就说A通过该接口依赖B类

3、依赖倒转原则

  • 高层模块不应该依赖低层模块,二者都应该依赖其抽象

  • 抽象不应该依赖细节,细节应该依赖抽象

  • 依赖倒转的中心思想是面向接口编程(接口指定规则,细节交由实现类)

    依赖传递的三种方式

    1. 接口传递(普通方法参数直接接受接口作为参数)
    2. 构造方法传递(接口作为构造方法的参数传递到类内部)
    3. setter方法(使用setter方法将接口传递到类内部)

4、里氏替换原则

继承带来的问题:

  • 父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏
  • 使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障

原则概述:

​ 如果对每个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型换句话说,所有引用基类的地方必须能透明地使用其子类的对象

​ 无意识重写父类方法,使程序结果不正确,解决方式:创建一个更加基础的基类,让这两个类去掉继承关系

注意事项:

  • 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法
  • 继承实际上让两个类耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖来解决问题

5、开闭原则(ocp)

  • 一个软件实体如类,模块和函数应该 对扩展开放( 对提供方),对 修改关闭( 对使用方)。用抽象构建框架,用实现扩展细节
  • 当软件需要变化时,尽量 通过扩展软件实体的行为来实现变化,而不是 通过修改已有的代码来实现变化
  • 还是有面向接口编程

6、迪米特法则

  • 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类 对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的 public 方法,不对外泄露任何信息,迪米特法则还有个更简单的定义:只与直接的朋友通信
    • 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量, 方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部
    • 通俗一点:也就是在类中方法中new 出来的变量为陌生类

注意事项:

  • 迪米特法则的核心是降低类之间的耦合
  • 但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系

7、合成复用原则

  • 原则是尽量使用合成/聚合的方式,而不是使用继承

8、设计原则核心思想

  • 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
  • 针对接口编程,而不是针对实现编程
  • 为了交互对象之间的松耦合设计而努力

二、UML类图

1、基本介绍

  • UML——Unified modeling language UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果
  • UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等
  • 都是把自己的思想描述给别人看,关键在于思路和条理
  • UML图分类
    • 用例图
    • 静态结构图:类图、对象图、包图、组件图、部署图
    • 动态行为图:交互图(时序图与协作图)、状态图、活动图
  • UML类图
    • 用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系
    • 类之间的关系: 依赖、泛化(继承)、实现、关联、聚合与组合

2、依赖

  • 只要在类中用到的了对方,那么他们之间就存在依赖关系,如果没有对方就不能通过编译
  • 符号---------->(dependency)
  • A类用到B类,A依赖B,箭头指向B

3、泛化

  • 泛化实际就是继承关系
  • 符号——————————▷(generalization)
  • A类继承B类,A继承B,箭头指向B

4、实现

  • 就是接口实现关系
  • 符号----------▷(implementation)
  • A类实现B类,A实现B,箭头指向B

5、关联(association)

  • 关联关系实际是类与类之间的联系,依赖关系的特例

  • 关联具有导向性:即双向关系(一个人有一个身份证,一个身份证对应一个人(在Person类和IDCard类中分别创建对方的实体属性))和单向关系(一个人有一个身份证(只在Person类中创建IDCard类的属性)),自关联(本类的属性存在本类的对象(树形结构))

  • 关联具有多重性:如'1'(表示有仅有一个),'0...'(表示0个或者多个),'0,1'(表示0个或一个),'n...m'(表示n到m个都可以),'m...*'(表示至少m个)

  • 类型

    • 单向关联:符号Person——————————>IDcard
    • 双向关联:符号Person——————————IDcard
    • 自关联:符号TreeNode——————————>TreeNode

6、聚合

  • 聚合关系表示的是整体和部分的关系,整体与部分可以分开。聚合关系是 关联关系的特例,所以他具有关联的 导航性与多重性
  • 如:一台电脑由键盘(keyboard)、显示器(monitor),鼠标等组成;组成电脑的各个配件是可以从电脑上分离出来的,剥离出来之后是可以单独存在
  • 符号——————————◇(aggregation,空心菱形)
  • monitor——————————◇keyboard

7、组合

  • 组合关系:也是整体与部分的关系,但是整体与部分不可以分开
  • 如:在程序中我们定义实体:Person与IDCard、Head(头), 那么Head和Person就是组合,IDCard和Person就是聚合(也可定义成组合)
  • 符号——————————◆(composition,实心菱形)
  • Head——————————◆Person
版权声明
本文为[xiaokantianse]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/xiaokantianse/p/13949654.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云