面向对象设计原则

亚瑟
• 阅读 1190

面向对象设计原则

对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问
题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一

7种常用的面向对象设计原则

设计原则名称 定义 使用频率
单一职责原则(Single Responsibility Principle, SRP) 一个类只负责一个功能领域中的相应职责 ★★★★☆
开闭原则(Open-Closed Principle, OCP) 软件实体应对扩展开放,而对修改关闭 ★★★★★
里氏代换原则(Liskov Substitution Principle, LSP) 所有引用基类对象的地方能够透明地使用其子类的对象 ★★★★★
依赖倒转原则(Dependence Inversion Principle, DIP) 抽象不应该依赖于细节,细节应该依赖于抽象 ★★★★★
接口隔离原则(Interface Segregation Principle, ISP) 使用多个专门的接口,而不使用单一的总接口 ★★☆☆☆
合成复用原则(Composite Reuse Principle, CRP) 尽量使用对象组合,而不是继承来达到复用的目的 ★★★★☆
迪米特法则(Law of Demeter, LoD) 一个软件实体应当尽可能少地与其他实体发生相互作用 ★★★☆☆

开闭原则

开闭原则是七大设计原则的基础。其定义如下:

开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实 体应尽量在不修改原有代码的情况下进行扩展。

使用的的前提是代码已经封板或者上线使用了,主要是为了提高代码的扩展性。

实现扩展的方式:

  1. 抽象并实现继承关系
  2. 面向接口编程,解耦
  3. 配置文件
  4. 脚本(groovy等)

里氏替换原则

里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透 明地使用其子类的对象。

在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。子类中不要重写父类中的非抽象方法

依赖倒置原则

依赖倒转原则(Dependency Inversion Principle, DIP):抽象不应该依赖于细节,细节应当依 赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
在逻辑编写的过程中,不需要清楚实现过程。比如service在调用dao时就是使用的接口实现的。为了确保该原则的应用,一个具体类应当只实现接口或抽象类中声明过的方
法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法。

在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入 (DependencyInjection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依 赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入 (Setter注入)和接口注入。构造注入是指通过构造函数来传入具体类的对象,设值注入是指通过 Setter方法来传入具体类的对象,而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。 这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。

单一职责原则

单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。

单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应 职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。

  • 如何去定义一个类
  • 一个类由内在状态和外在行为组成
  • 不要让一个类干太多的事情,这样不方便类的复用
  • 最难使用的原则,因为如何对类的内在状态和外在行为进行分类汇总,是一件特别需要经验的事

接口隔离原则

接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

  • 如何去定义一个接口
  • 接口主要是为了给类级别去提供增强的功能
  • 每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干

合成复用原则

合成复用原则(Composite Reuse Principle, CRP):尽量使用对象组合,而不是继承来达到复用的目的。

要尽量使用组合/聚合关系(关联关系),少用继承。

迪米特法则

迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。

  • 高内聚,低耦合
  • 不要和陌生人说话,以下几类可以是朋友:
    (1) 当前对象本身(this);
    (2) 以参数形式传入到当前对象方法中的对象;
    (3) 当前对象的成员对象;
    (4) 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
    (5) 当前对象所创建的对象。

总结

【开闭原则】是总纲,它告诉我们要【对扩展开放,对修改关闭】;【里氏替换原则】告诉我们【不要破坏继承 体系】;【依赖倒置原则】告诉我们要【面向接口编程】;【单一职责原则】告诉我们实现【类】要 【职责单一】;【接口隔离原则】告诉我们在设计【接口】的时候要【精简单一】;【迪米特法则】告 诉我们要【降低耦合度】;【合成复用原则】告诉我们要【优先使用组合或者聚合关系复用,少用继承 关系复用】。

正文到此结束

本文转自 http://blog.pkspace.cn/article/3,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
2年前
Java 面向对象的设计原则
一、1、面向对象思想的核心:封装、继承、多态。2、面向对象编程的追求:  高内聚低耦合的解决方案;  代码的模块化设计;3、什么是设计模式:  针对反复出现的问题的经典解决方案,是对特定条件下(上下文)问题的设计方案的经验总结,是前人设计实践经验的精华。4、面向对象设计原则
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这