java设计模式--七大原则详解


Posted in Java/Android onJuly 21, 2021

设计模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

打个比方就像盖大厦和小木屋,当功能简单,函数和代码少时,我们能较轻松的直接上手;但如果是像大厦那样,功能复杂,需求可能变化且代码量大时,我们就不能直接上手就来,需要像建筑图纸那样提前规划设计,那设计模式就像软件(程序)的建筑图纸。

设计模式的目的是为了让软件(程序)具有更好的:

1.代码重用性

相同功能的代码,不用多次编写,降低冗余

2.可读性

编程规范性, 便于其他程序员的阅读和理解

3.可扩展性

当需要增加新的功能时,非常的方便,也称为可维护性

4.可靠性

当我们增加新的功能后,对原来的功能没有影响

5.使程序呈现高内聚,低耦合的特性

模块内部紧密,但模块间依赖小,一者出错不影响他者

单一职责原则

单一职责原则(Single responsibility principle),即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1、A2。

单一职责原则注意事项和细节

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

java设计模式--七大原则详解

接口隔离原则

接口隔离原则(Interface Segregation Principle),即客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。

比如:类A通过接口 I I I依赖类B,类C通过接口 I I I依赖类D,如果接口 I I I对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法。

java设计模式--七大原则详解

按隔离原则应当这样处理:将接口 I I I拆分为独立的几个接口,将类分别与他们需要的接口建立依赖关系,也就是采用接口隔离原则。

java设计模式--七大原则详解

依赖倒转原则

依赖倒转原则(Dependence Inversion Principle),依赖倒转(倒置)的中心思想是面向接口编程,所谓“倒转”是指抽象不应该依赖细节,而是细节应该依赖抽象。也就是高层模块不应该依赖低层模块,二者都应该依赖其抽象。因为相对于细节的多变性,抽象的东西要稳定的多。

比如有个Person类,可以接受Email、QQ和微信的消息。如果都为其提供一个专门的方法,就会让代码非常的冗余:

java设计模式--七大原则详解

可以引入一个IReceiver接口,让Person类依赖该接口。这样QQ、微信和Email各自实现IReceiver里面的方法即可:

java设计模式--七大原则详解

里氏替换原则

里氏替换原则(Liskov Substitution Principle)要求所有引用基类的地方必须能透明地使用其子类的对象。也就是在继承关系中,子类尽量不要重写父类的方法。继承实际上让两个类耦合性增强了,特别是运行多态比较频繁的时,整个继承体系的复用性会比较差。比如一种极端情况:一个类继承了另一个类,但却重写了所有方法,那么继承的意义何在?说好的复用呢?

java设计模式--七大原则详解

解决方法是把原来的父类和子类都继承一个更通俗的基类,在适当的情况下,可以通过聚合,组合,依赖等来代替。

java设计模式--七大原则详解

开闭原则

开闭原则(Open Closed Principle)一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。也就是当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。用抽象构建框架,用实现扩展细节。开闭原则是编程中最基础、最重要的设计原则。编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。

举个违反开闭原则的例子:

矩形Retangle和圆形Circle继承了图形类Shape(提供方),画图类GraphicEditor(使用方)会调用相关属性。

java设计模式--七大原则详解

但是如果再新增一个三角形,就要在使用方GraphicEditor新增对应方法,修改地方较多,违背开闭原则。

java设计模式--七大原则详解

改进:把Shape做成抽象类并提供抽象方法draw,让子类去实现即可。当新增图形种类时,只需让新的图形类继承Shape,并实现draw方法即可。使用方的代码就不需要修改,满足开闭原则。

java设计模式--七大原则详解

迪米特法则

迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好,核心是降低类之间的耦合。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public 方法,不对外泄露任何信息。避免与非直接朋友的耦合,只与直接的朋友通信,所谓的直接朋友是出现成员变量,方法参数,方法返回值中的类。而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

比如有学院员工类和学校员工类,然后各有一个管理类有可以获取其所有员工,学校员工管理类有方法打印全部员工。

java设计模式--七大原则详解

具体代码:

void printAllEmployee(CollegeManager sub) {
		//获取到学院员工
		List<CollegeEmployee> list1 = sub.getAllEmployee();
		System.out.println("---学院员工---");
		for (CollegeEmployee e : list1) {
			System.out.println(e.getId());
		}
		//获取到学校总部员工
		List<Employee> list2 = this.getAllEmployee();
		System.out.println("---学校员工---");
		for (Employee e : list2) {
			System.out.println(e.getId());
		}
	}

分析SchoolManager类,发现Employee和CollegeManager都是它的直接朋友(出现在参数和返回值中),但CollegeEmployee不是直接朋友,是以局部变量的形式,违背了迪米特原则。

改进:避免依赖CollegeEmployee,封装在CollegeManager中,对外提供public方法即可。

java设计模式--七大原则详解

void printAllEmployee(CollegeManager sub) {
		sub.printEmployee();
		//获取到学校总部员工
		List<Employee> list2 = this.getAllEmployee();
		System.out.println("---学校员工---");
		for (Employee e : list2) {
			System.out.println(e.getId());
		}
	}

合成复用原则

合成复用原则(Composite Reuse Principle)就是是尽量使用合成/聚合的方式,而不是使用继承。

java设计模式--七大原则详解

java设计模式--七大原则详解

java设计模式--七大原则详解

java设计模式--七大原则详解

总结

设计原则核心思想

针对接口编程,把应用中可能需要变化的代码和不需要变化的代码分开独立。都是为了交互对象间解耦合而操心。

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注三水点靠木的更多内容!

Java/Android 相关文章推荐
Java数据结构之链表相关知识总结
Jun 18 Java/Android
详解Java实践之适配器模式
Jun 18 Java/Android
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
Jun 26 Java/Android
Spring整合Mybatis的全过程
Jun 28 Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 Java/Android
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
Sep 25 Java/Android
Java 超详细讲解设计模式之中的抽象工厂模式
Mar 25 Java/Android
Android自定义双向滑动控件
Apr 19 Java/Android
Spring Boot 使用 Spring-Retry 进行重试框架
Apr 24 Java/Android
解决Springboot PostMapping无法获取数据的问题
May 06 Java/Android
Android Studio实现带三角函数对数运算功能的高级计算器
May 20 Java/Android
ConditionalOnProperty配置swagger不生效问题及解决
Jun 14 Java/Android
java设计模式--建造者模式详解
java设计模式--原型模式详解
SpringBoot快速入门详解
java设计模式--三种工厂模式详解
gateway与spring-boot-starter-web冲突问题的解决
Jul 16 #Java/Android
springboot集成springCloud中gateway时启动报错的解决
Jul 16 #Java/Android
JavaWeb 入门篇(3)ServletContext 详解 具体应用
You might like
根德YB400的电路分析
2021/03/02 无线电
php页面函数设置超时限制的方法
2014/12/01 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
php session的应用详细介绍
2017/03/22 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
2013/06/25 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
Three.js加载外部模型的教程详解
2017/11/10 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
django批量导入xml数据
2016/10/16 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
用python批量移动文件
2021/01/14 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
皮肤科医师岗位职责
2013/12/04 职场文书
大学生职业生涯规划方案
2014/01/03 职场文书
打架检讨书100字
2014/01/08 职场文书
给同事的道歉信
2014/01/11 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
三万活动总结
2014/04/28 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript