文章目录

面向对象设计原则概述

单一职责原则

开闭原则

里氏代换原则


面向对象设计原则概述

软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量软件质量的属性,软件的可维护性是指软件能够被理解、改正、适应及拓展的难易程度,软件的可复用性是指软件能够被重复使用的难易程度。

面向对象的设计目标之一在于支持可维护性复用,一方面需要实现设计方案或者源代码的复用,另一方面确保系统能够易于拓展与修改,具备良好的可维护性。

面向对象设计原则也是后续学习设计模式的基础,某一个设计模式都符合某一个或者多个面向对象的设计原则。

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

单一职责原则

概述

单一职责原则是最简单的面向对象的设计原则,它用于控制类的粒度大小,其定义如下:一个对象应该只包含单一的职责,并且该职责被单一地封装在一个类中。另一种定义是:就一个类而言,应该仅有一个引起它变化的原因

在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,相当于将这些职责耦合在一起,当其中一个职责变化时可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。

单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又是最难运用的原则。

示例

这个设计原则最简单也很容易理解,故省略示例代码。


开闭原则

概述

开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象的设计原则。

开闭原则的定义是:软件实体应当对拓展开放,对修改关闭。通俗地来说,开闭原则就是指在软件实体尽量在不修改原有代码的情况下进行拓展。

为了满足开闭原则,需要对系统进行抽象化的设计,抽象化是开闭原则的关键。在很多面向对象的语言中都提供了接口、抽象类等机制,可以通过它们来定义系统的抽象层,再通过具体类来进行拓展。如果有新的业务需求,只需要增加新的具体类来实现新的业务功能,不需要变动抽象层,这样就达到了在不修改原来代码的前提下拓展系统的功能,达到开闭原则的要求。

示例

代码

AbstractSkin.java
package com.Demo.Principles.开闭原则;
/*** 抽象皮肤类*/
public abstract class AbstractSkin {//用于显示public abstract void display();
}
DefaultSkin.java
package com.Demo.Principles.开闭原则;public class DefaultSkin extends AbstractSkin{@Overridepublic void display() {System.out.println("这是默认皮肤...");}
}
HeimaSkin.java
package com.Demo.Principles.开闭原则;public class HeimaSkin extends AbstractSkin{@Overridepublic void display() {System.out.println("这是黑马皮肤...");}
}
SogoInput.java

该类实现聚合关系,将抽象皮肤类与具体的皮肤类进行聚合,后者与前者属于部分与整体的关系。

package com.Demo.Principles.开闭原则;/*** 聚合关系:搜狗输入法类*/
public class SogoInput {private AbstractSkin skin;//传入皮肤类public void setSkin(AbstractSkin skin){this.skin=skin;}//调用当前皮肤的显示输出的方法public void display(){skin.display();}
}

 测试已有皮肤对象

此时,如果有了一个新的业务需求,要求增加一个王者皮肤,只需要增加一个新的具体皮肤类继承抽象的皮肤类,实现其所有方法,达到了“开闭原则”。

KingSkin.java

和前面的具体皮肤类写法一致,进行业务的拓展,无需修改原有的任何代码

package com.Demo.Principles.开闭原则;public class KingSkin extends AbstractSkin{@Overridepublic void display() {System.out.println("这是王者皮肤...");}
}

测试新增加的皮肤

这就是开闭原则的简单运用,不修改原代码实现业务功能的拓展,对拓展开放,对修改关闭


里氏代换原则

概述

里氏代换原则是指:所有引用基类(父类)的地方必须能够透明地使用其子类的对象

通俗理解就是,子类可以拓展父类的功能,但不能改变父类原有的功能。

换句话说,子类继承父类时,除了添加新的方法完成新的业务功能之外,尽量不要去重写父类的方法,否则会导致整个继承体系的可复用性变差。

里氏代换原则表明:

  • 在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常
  • 反之则不成立,如果一个软件实体使用的是一个子类对象,那么它不一定能使用基类对象

 因此,我们在软件设计时:

  • 在程序中尽量使用基类类型来定义对象,因为在使用基类对象的地方一定可以使用其子类对象;而在运行时再确定其子类类型,用子类对象来替换父类对象
  • 在使用该原则时,应该将基类,即父类设计成抽象类或者接口,让子类继承父类或者实现父类的接口,并实现在父类中声明的方法,在运行时子类实例替换父类实例,可以很方便的拓展系统的功能,无需修改原有的子类的代码,增加新的功能可以通过增加一个新的子类来实现

END.

Java设计原则之单一职责原则、开闭原则、里氏代换原则相关推荐

  1. 设计原则(3)-里氏代换原则

    本文转自:http://www.cnblogs.com/guoshiandroid/archive/2010/06/14/1758047.html 里氏代换原则 法海捉拿白蛇新解  应用场景举例: & ...

  2. Android大话设计模式 第四章----里氏代换原则----法海捉拿白蛇新解

    应用场景举例: <白蛇传>是中国四大民间传说之一,妇孺皆知. 在大多数人的感觉和印象中,白蛇是一个善良痴情.知恩图报.温柔友善.美貌绝伦.冰雪聪明.明辨是非.救苦救难的活菩萨:而法海却是一 ...

  3. 里氏替换原则_代码需要有单一职责,还要开闭,里氏替换又是什么鬼?

    目录 单一职责原则: 开闭原则: 里氏替换原则: 单一职责原则: 每一个系统中的功能都表示一个职责,这些职责可以映射到模块(类)中, 且尽可能的保证这些类中没有功能上的重复,设计中每次应只关注一个职责 ...

  4. 经典设计原则:单一职责原则(SRP)

    本文详解设计原则中的单一职责原则,目的还是提高代码的可读性.可扩展性.复用性.可维护性等. 目录 1. 单一职责原则(SRP) 2. 如何理解单一职责原则? 3. 如何判断类的职责是否足够单一? 4. ...

  5. 设计原则 单一职责原则、开放封闭原则、依赖倒置原则、里氏代换原则、迪米特法则

    目录 1 单一职责原则 2 开放封闭原则 3 依赖倒置原则 4 里氏代换原则 5 迪米特法则 1 单一职责原则 比如:电脑内存坏了就应该更换内存,不应该更换CPU (内存负责内存.CPU负责CPU) ...

  6. 1. 目标精通--用java写设计模式:单一职责原则

    文章目录 1.什么是单一职责原则 2. 单一职责原则的认识 3. 代码案例 3.1 一个正常的代码 3.1.1执行结果 3.1.2 分析 3.2 职责扩散 3.2.1 执行结果 3.2.2 分析 3. ...

  7. 设计原则:单一职责原则

    单一职责原则(SRP) 单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP.这个原则的英文描述是这样的:A class or module shoul ...

  8. Java设计模式之设计的6大原则(开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,最少知道原则,合成复用原则)

    1. 开闭原则 核心思想:一个对象对外扩展开发,对修改关闭 意思就是:对类的改动是通过增加代码进行的,而不是修改现有的代码. 也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证 ...

  9. java设计模式1,单一职责原则

    目录 一.单一职责原则定义 二.模拟场景 三.违背原则方案 1.配置类 2.逻辑代码 3.测试类 四.单一职责原则改善代码 1.定义接口 2.实现类,普通用户 3.实现类,专属用户 4.VIP用户 一 ...

最新文章

  1. 波特率与比特率的关系
  2. Jan 09 - Number of 1 Bits; Bit Operation;
  3. centos远程mc服务器,Centos7 下最最最简单的部署 MC 服务器超轻松学废
  4. Activiti源码 之 DataManager EntityManager
  5. windows符号服务器地址
  6. mysql g月份分组_PowerBI快捷键——视觉对象分组功能
  7. 基于小程序·云开发构建高考查分小程序丨实战
  8. getsockname与getpeername
  9. android 4.0下访问主进程访问网络和开启另外另外的线程
  10. 完美解决 IDEA plugins 插件搜索不出结果
  11. Servlet的request.getRemoteAddr()方法回去地址是0:0:0:0:0:0:0:1
  12. 《DB 查询分析器》使用技巧之(七)
  13. 【MFC学习笔记-作业7-小型画图软件】【】
  14. 3802.消灭数组-AcWing题库
  15. vb 6.0 常用工具(鼠标移动,代码补全,代码对齐)
  16. imshow、image以及imagesc的区别
  17. freenas 11.2踩过的坑
  18. 在线自定义编辑网络拓扑图
  19. webrtc音频QOS方法三(回声的产生及抑制)
  20. python有理数_Python3标准库:fractions有理数

热门文章

  1. Win10+VS2017的C++属性配置表
  2. 详细分析:摄像头像素为何不是越高越好
  3. jarsigner签名APK完整步骤
  4. 数据结构 — 浅析红黑树原理以及实现
  5. 学生宿舍管理mysql设计_学生宿舍管理系统设计与实现(SSH,MySQL)
  6. register关键字的使用
  7. 【GAN:Dense block:VIIF】
  8. 给初级beatles热爱者提供的歌曲MP3下载
  9. Java 关于使用Arrays.asList()数组转集合的问题
  10. CAE-仿真案例学习