概念:

在面向对象设计中,可维护性的复用事宜设计原则为基础的。每一个设计原则都蕴含一些面向对象设计的思想,可以从不同的角度来提升一个软件结构的设计水平。最常见得设计包含7种:

单一职责原则

概念:一个类只负责一个功能领域中的相应的职责,或者可以定义为:一个类只有一个引起变化的原因。

单一职责原则是实现高内聚、低耦合的指导方针的,他是最简单又难以运用的原则,需要设计人员发现类的不同职责并将其分离出来,而发现类的多重职需要设计人员有较强的分析能力和丰富的工作经验。

例如:当我们做一个CRM项目的时候,有很多功能需要对数据库中的数据表进行操作,首先需要我们先连接数据库,需要用到的方法是getConnection()的方法,这时我们可以的将这个方法独自创建一个连接数据库的工具类。当需要连接数据库的时候,之间调用这个工具类的方法,而不要每个功能点类独自再去写连接数据库的方法。

开闭原则

概念:开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。其定义是:一个软件实体应当对扩展开放,对修改关闭。即软件实体应当在不修改源代码的情况下进行扩展。软件实体可以是一个软件模块、一个有多个类组成的局部结构或者一个独立的类。

当我们成功上线一个软件之后,随着时间推移,我们必定会出现许多新的功能需求来满足客户需求,这就使得软件维护要求越来越高。在很多面向对象编程语言中提供了很多的接口和抽象类等机制,可以通过定义系统的抽象层,在通过具体的类进行扩展。如果需要对系统进行需改,无修改抽象层,只需添加新的具体类来实现新的业务功能即可,达到开闭原则的要求。

我们引入了抽象图表类AbstractChart, 且ChartDisplay针对抽象图表类进行编程, 并通过setChart()方法由客户端来设置实例化的具体图表对象, 在ChartDisplay的display()方法中调用chart对象的display()方法显示图表。 如果需要增加一种新的图表, 如折线图LineChart, 只需要将LineChart也作为AbstractChart的子类, 在客户端向ChartDisplay中注入一个LineChart对象即可, 无须修改现有类库的源代码。

里氏代换原则

概念:所有引用基类(父类)的地方必须能够透明的使用其子类对象。

有Java基础都能够明白父类和子类的使用情况,需要需要使用里氏代换原则需注意以下:

  1. 子类必须实现父类的所有方法,根据里氏代换原则,为例保证系统的可扩展性,在程序中通常使用父类来进行定义
  2. 在运用里氏代换原则,尽量把父类设计为抽象类或者是接口,让子类继承抽象类或者实现父接口,并实现父类中声明的所有方法,运行时,子类实例替换父类实例,我么可以很方便的实现扩展系统功能。里氏代换原则是开闭原则实现的具体手段之一。

实例:正方形 长方形   这里面讲得很清楚,很详细

依赖倒转原则

概念:依赖倒转原则是面向对象设计的主要实现机制之一,他是系统抽象化的具体实现。其定义:抽象不应当依赖于细节,细节应当依赖于抽象,换言之,要针对接口的编程,而不是针对实现编程。

依赖倒转原则要求我们在程序代码中的传递参数时或者关联关系中,尽量引用层高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型转换等,而不要用具体的类。在实现依赖倒转原则时,我们需要针对的是的抽象层编程,而将具体类的对象通过依赖注入到其他对象中,常用的注入方式:

  1. 构造注入:通过构造函数传入具体类的对象
  2. 设置注入(Setter注入):指通过Setter方法来传入具体类的对象
  3. 接口注入:指接口中声明业务方法来出入具体类的对象

接口隔离原则

概念:使用读个单一的接口而不是使用总接口,即客户端不需要依赖那些它不需要的接口。

这里的接口往往有俩种概念:

  • 指一个类型所具有的方法特征集合,仅仅是一种逻辑上的抽象。
  • 某种语言具体的接口定义,有严格的定义和结构,如Java中的interface。

(1) 当把“接口”理解成一个类型所提供的所有方法特征的集合的时候, 这就是一种逻辑上的概念, 接口的划分将直接带来类型划分。 可以把接口理解成角色, 一个接口只能代表一个角色, 每个角色都有它特定的一个接口, 此时, 这个原则可以叫做“角色隔离原则”。
(2) 如果把“接口”理解成狭义的特定语言的接口, 那么ISP表达的意思是指接口仅仅提供客户端需要的行为, 客户端不需要的行为则隐藏起来, 应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。 在面向对象编程语言中, 实现一个接口就需要实现该接口中定义的所有方法, 因此大的总接口使用起来不一定很方便, 为了使接口的职责单一, 需要将大接口中的方法根据其职责不同分别放在不同的小接口中, 以确保每个接口使用起来都较为方便,并都承担某一单一角色。 接口应该尽量细化, 同时接口中的方法应该尽量少, 每个接口中只包含一个客户端( 如子模块或业务逻辑类) 所需的方法即可, 这种机制也为“定制服务”, 即为不同的客户端提供宽窄不同的接口。

合成复用原则(组合/聚合复用原则)

概念:尽量使用对象组合,而不是使用继承来达到复用的目的。合成复用原则就是在一个新的对象里通过关联关系来使用一些已有的对象。

在面向对象设计中,可以同通过俩种方式在不同的环境中复用已有的设计和实现,即同通过组和/聚合关系或者通过继承。但是首先考虑的是合成复用,它更加灵活,降低类与类之间耦合度,其次在考虑继承,使用的继承可以有效降低程序的复杂的,但是滥用继承会增加的系统构建和维护的复杂度。

实例:当一个CustomerDAO类操作MySql数据库的时候,首先需要连接数据库,使用工具类DBUtil提供的getConnection()方法,所以设计成CustomerDAO继承DBUtil,这样CustomerDAO类可以复用DBUtil类的getConnection()方法。假如后期项目的需求更换数据库为Oracle,我们还需要写一个oracle的类来实现连接,这样需要更改CustomerDAO和DBUtil的源码,不符合设计要求。所以这里我们使用合成复用原则,将DBUtil类注入到CustomerDAO类中,将oracle连接类继承DBUtil类,这样我们就不需要修改源码,实现更换数据的方法。

迪米特法则

概念:一个软件实体尽可能少地与其他实体发生相互作用。意思就是当修改一个模块的时候,尽可能的避免其他模块受修改模块的影响。这是对软件实体之间通信的限制,降低模块之间的耦合度,利于系统的维护。

就像上图,关系复杂,不便于的维护和修改,对界面新添加一个新的界面控制按钮,会导致的其必须修改源码。所以修改下图的方式:

修改成它们共同受一个第三者的类或者接口来控制它们之间的交互问题。

参考书籍《Java设计模式》----刘伟

面向对象七大设计原则相关推荐

  1. php实现面向对象七大设计原则

    面向对象七大设计原则: 单一原则:一个类只用来负责一个功能模块,比如支付类,只允许有支付类存储 <?php # 单一职责原则 即一个类只用来做当前项目中惟一的方法 class SingleRes ...

  2. Java设计模式--------面向对象七大设计原则

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.单一职责原则 二.开闭原则 三.接口隔离原则 什么是接口隔离原则 接口隔离原则分析 四.里氏替换原则 继承 为什么 ...

  3. 面向对象七大设计原则之依赖倒置原则

    熟练掌握和应用面向对象设计七大原则,是初中级工程师向高级/资深工程师进阶的一个必备技能.他可以大大的提升程序的可复用性和可维护性是重构代码的一大利器. 本人菜鸟一枚本面文章的出发点是1.加深个人印象. ...

  4. 面向对象七大设计原则之里氏替换原则

    熟练掌握和应用面向对象设计七大原则,是初中级工程师向高级/资深工程师进阶的一个必备技能.他可以大大的提升程序的可复用性和可维护性是重构代码的一大利器. 本人菜鸟一枚本面文章的出发点是1.加深个人印象. ...

  5. 面向对象(OOP)的七大设计原则

    如何学习设计模式                                                                                             ...

  6. 面向对象设计的七大设计原则详解

    面向对象的七大设计原则 文章目录 面向对象的七大设计原则 简述 七大原则之间的关系 一.开闭原则(The Open-Closed Principle ,OCP) 概念理解 系统设计需要遵循开闭原则的原 ...

  7. java七大设计原则

    java七大设计原则 1.开闭原则(Open Close Principle) 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽 ...

  8. 设计模式 - 七大设计原则(一)

    设计模式 - 七大设计原则(一) 概述 简单介绍一下七大设计原则: 开闭原则:是所有面向对象设计的核心,对扩展开放,对修改关闭 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体 单一职责原则:一个 ...

  9. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

  10. 软件架构(软件体系结构)-设计原则篇(七大设计原则)

    软件架构(软件体系结构)-设计原则篇(七大设计原则) 1.软件架构设计原则概述 1.1.软件的可维护性 1.软件的维护 一个好的软件设计可维护性较好的系统,必须能够允许新的设计要求很容易地加入到已有的 ...

最新文章

  1. 用人话理解hash算法、特性、唯一性等
  2. undefined reference to symbol ‘_ZN2cv7imwriteERKNS_6StringERKNS_11_InputArrayERKSt6vectorIiSaIiEE‘
  3. linux 查明文密码,win10系统查看明文密码的操作方法
  4. 「后端小伙伴来学前端了」Vue脚手架中 render 函数
  5. C++ map 中的reverse_iterator
  6. zookeeper基本原理及适用场景 转:http://blog.chinaunix.net/uid-26748613-id-4536290.html
  7. Spring自定义注解简单使用四步走
  8. 发现2017年最好的CSS框架
  9. 数学家眼里的相同与不同
  10. 产品经理对企业的价值
  11. Opencv--Mat类型ROI的设置
  12. spring boot要如何学习?
  13. JMETER性能测试从入门到精通高级篇 - 分布式压测部署之负载机的设置(详解教程)
  14. Spring Boot 集成 Redis 实现缓存机制
  15. 【R语言】R语言在安装与下载时遇到的问题与解决方法
  16. UE4学习-初识虚幻引擎(下载、安装、重定向问题、安装引擎、启动)
  17. 点击edittext 区域外隐藏输入法和点击edittext 显示输入法
  18. 后端每天更新微信用户用户头像
  19. 计算机大学生职业规划结课论文,大学生职业规划结课论文要求
  20. Ubuntu16.04中鼠标左右键功能相反

热门文章

  1. 雅型钢五金大全(五金计算器)绿色便携版V20220512 | 实用五金计算软件下载
  2. MFC 激活CPropertySheet 的应用按钮
  3. cool edit pro 2.1中文版未定义外部错误怎么解决
  4. cad转shp 奥维_CAD转化为Shp
  5. php adodb类库下载,PHP_PHP程序中使用adodb连接不同数据库的代码实例,adodb.inc.php文件需要去下载一个 - phpStudy...
  6. 华东师范数学分析第4版笔记和课后答案
  7. 英文名大全及含义(男)
  8. VBScript入门篇
  9. 恒温箱温度计算机控制系统仿真,实验用恒温箱控制系统设计及其模型建立
  10. Android常用库整理