Gof设计模式之七大设计原则(六)

前言

今天的设计原则重理论,举例子只能是文字形式,没法使用代码解释,希望大家可以多读几遍。真正体会到设计原则的好处。每一个设计原则,我都尽量用非术语的话大白话再给 大家说一下,如果还不明白,可私信我。

开放封闭原则

定义:一个整体的软件实例,类或者接口等应该保持对修改封闭,对扩展开放的设计思想。

大白话:其实这原则还是比较容易理解的,就是对类、接口之类的尽量设计的足够好,好到不需要去动他的核心逻辑,如果遇到需求增加,那么可以通过扩展来增强功能即可,增加一个类就可以解决你以后的业务处理,这就是开放封闭原则。

里氏代换原则

定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

定义2:子类型必须能够替换掉它们的父类型。

大白话:在软件里面,把父类都替换成它的子类,程序的行为没有变化,子类可以扩展父类,但是父类的原有行为不能改变。正是由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展,不然还谈什么扩展开放,修改关闭呢

依赖倒转原则

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程。

大白话:依赖倒转的原则就是,谁也不要依靠谁,大家都是一个独立的,我们 统一面对的是接口、抽象类,我们程序中所有的依赖关系最终应该是接口或者抽象类,那就是面向对象开发,如果不是那就是过程式开发。无论哪种语言,都应该考虑是面对抽象编程,而不是面对细节编程。

在实际编程中,我们一般需要做到如下3点:

低层模块尽量都要有抽象类或接口,或者两者都有。

变量的声明类型尽量是抽象类或接口。

使用继承时遵循里氏替换原则。

接口隔离原则

定义:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。

大白话:接口隔离就是尽量把接口进行细分,接口尽量做得小一些,但也不是太小,接口的大小把握好力度,同时把调用类需要的结构暴露出来,不需要的要隐藏好,并且要提高内聚,降低耦合,设计接口要多花时间去琢磨,尽量控制好接口的大小跟功能范围。

组合/聚合复用原则

定义:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的。

大白话:其实理解这个原则,可以先了解aop,aop面向切面编程,目的就是为了从广度上增强项目功能,而不是靠继承从深度上实现功能,这个原则的目的也是,尽量避免使用继承从而增加代码的复杂性,降低可维护性,组合复用就是尽量减少依赖,但是增加了对象调用,系统将会增加管理对象的负担,所以该原则也不是必须的,各位根据自己的情况自己评估。

迪米特法则

定义:强调了类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成影响

大白话:我们以前一直接触的一个词叫做高内聚低耦合,目的就是降低类与类之间的耦合程度,该类的修改不会影响到其他类,保障一个被依赖的类最少的暴露结构,除了public,其他的都应该隐藏,再难的逻辑也应该是依赖类自己完成,不要暴露给其他类,让依赖的类知道的越少越好。

单一职责原则

定义:不要存在多于一个导致类变更的原因。

大白话:如果前面的都能理解了,那么这个就很容易了,通俗的说,即一个类只负责一项职责,应该仅有一个引起它变化的原因。

学而时习之,温故而知新,望大家多回头看看以前的系列文章。

原文发布于微信公众号 - 精讲JAVA(toooooooozi)

原文发表时间:2017-10-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

编写高质量代码的思考

最近在看《代码大全》,可以说是一本软件开发的百科全书,特别厚,但是干货也很多。平时写代码,代码规范是一个最低的要求(很多老代码连最低要求都达不到),为什么要这样...

952
来自专栏王亚昌的专栏

让代码更有效率的方法

        老大总结的代码级提高代码执行效率需要注意的点,很值得和大家分享一下,在这儿也由衷地感谢下老大的总结和工作中的指导。大多数的点都在项目中验证过,比...

791
来自专栏Python研发

设计模式 -- 常用设计模式

                                  ——可复用面向对象软件的基础

3001
来自专栏编程

编写高质量代码的思考

前言 最近在看《代码大全》,可以说是一本软件开发的百科全书,特别厚,但是干货也很多。平时写代码,代码规范是一个最低的要求(很多老代码连最低要求都达不到),为什么...

2456
来自专栏韩伟的专栏

框架设计原则和规范(一)

此文是《.NET:框架设计原则、规范》的读书笔记,本文内容较多,共分九章,将分4天进行推送,今天推送1-3章。 1. 什么是好的框架 2. 框架设计...

4415
来自专栏PHP在线

PHP 代码规范简洁之道

原文出处: Scholer 1. 统一的编码规范 编码规范往简单说其实就是三个方面: 换行 空格 变量命名 放在 PHP 里面,还有一些附加的地方,比如关键字...

4106
来自专栏程序员互动联盟

【编程基础】聊聊如何学习Java——Java的特性

上一篇文章聊了学习编程可能会遇到的心里障碍和为什么学习Java,看了网友们的回复小编很激动,我会积极听取网友们的留言,在我以后的文章中改进。现在说Java语言的...

3889
来自专栏JAVA高级架构

Java设计模式-责任链模式

作者:Jet啟思 链接:https://juejin.im/post/5a126b146fb9a0450c490201 今天来说说程序员小猿和产品就关于需求发生...

39711
来自专栏马洪彪

spss C# 二次开发 学习笔记(二)——Spss以及统计术语解释(IT人眼中的统计术语)

针对客户需求,需要对一些数据做统计分析。统计分析的第一步,即为数据查询,查找出要统计分析的数据。 查询得出的是一个行列表格的结果集,行、列、表格等这些IT的数据...

2805
来自专栏iOS技术

何为代码质量?——用脑子写代码引言正文总结

为什么项目维护困难、BUG 反复?实际上很多时候就是代码质量的问题。代码架构就像是建筑的钢筋结构,代码细节就像是建筑的内部装修,建筑的抗震等级、简装或豪装完全取...

692

扫码关注云+社区

领取腾讯云代金券