七大设计原则之单一职责原则应用
目录
- 1 单一职责原则介绍
- 2 单一职责原则应用
1 单一职责原则介绍
单一职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更的原因。假设我们有一个 Class 负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能会导致另一个职责的功能发生故障。这样一来,这个 Class 存在两个导致类变更的原因。如何解决这个问题呢?
我们就要给两个职责分别用两个 Class 来实现,进行解耦。后期需求变更维护互不影响。这样的设计,可以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。总体来说就是一个 Class/Interface/Method 只负责一项职责。
2 单一职责原则应用
接下来,我们来看代码实例,还是用课程举例,我们的课程有直播课和录播课。直播课不能快进和快退,录播可以可以任意的反复观看,功能职责不一样。还是先创建一个 Course 类:
public class Course {public void study(String courseName){if("直播课".equals(courseName)){System.out.println("不能快进");}else{System.out.println("可以任意的来回播放");}}}
看代码调用:
public static void main(String[] args) {Course course = new Course();course.study("直播课");course.study("录播课");}
从上面代码来看,Course 类承担了两种处理逻辑。假如,现在要对课程进行加密,那么直播课和录播课的加密逻辑都不一样,必须要修改代码。而修改代码逻辑势必会相互影响容易造成不可控的风险。我们对职责进行分离解耦,来看代码,分别创建两个类 ReplayCourse 和 LiveCourse:
LiveCourse 类:
public class LiveCourse {public void study(String courseName){System.out.println(courseName + "不能快进看");}}
ReplayCourse 类:
public class ReplayCourse {public void study(String courseName){System.out.println("可以任意的来回播放");}}
调用代码:
public static void main(String[] args) {LiveCourse liveCourse = new LiveCourse();liveCourse.study("直播课");ReplayCourse replayCourse = new ReplayCourse();replayCourse.study("录播课");}
业务继续发展,课程要做权限。没有付费的学员可以获取课程基本信息,已经付费的学员可以获得视频流,即学习权限。那么对于控制课程层面上至少有两个职责。我们可以把展示职责和管理职责分离开来,都实现同一个抽象依赖。设计一个顶层接口,创建 ICourse 接口:
public interface ICourse {//获得基本信息String getCourseName();//获得视频流byte[] getCourseVideo();//学习课程void studyCourse();//退款void refundCourse();}
我们可以把这个接口拆成两个接口,创建一个接口 ICourseInfo 和 ICourseManager:
ICourseInfo 接口:
public interface ICourseInfo {String getCourseName();byte[] getCourseVideo();}
ICourseManager 接口:
public interface ICourseManager {void studyCourse();void refundCourse();}
来看一下类图:
下面我们来看一下方法层面的单一职责设计。有时候,我们为了偷懒,通常会把一个方法写成下面这样:
private void modifyUserInfo(String userName,String address){userName = "Oldlu";address = "Shandong";}
还可能写成这样:
private void modifyUserInfo(String userName,String... fileds){userName = "Oldlu";
// address = "Shandong";}private void modifyUserInfo(String userName,String address,boolean bool){if(bool){}else{}userName = "Oldlu";address = "Shandong";}
显然,上面的 modifyUserInfo()方法中都承担了多个职责,既可以修改 userName,也可以修改
address,甚至更多,明显不符合单一职责。那么我们做如下修改,把这个方法拆成两个:
private void modifyUserName(String userName){userName = "Oldlu";}private void modifyAddress(String address){address = "Shandong";}
这修改之后,开发起来简单,维护起来也容易。但是,我们在实际开发中会项目依赖,组合,聚合这些关系,还有还有项目的规模,周期,技术人员的水平,对进度的把控,很多类都不符合单一职责。
但是,我们在编写代码的过程,尽可能地让接口和方法保持单一职责,对我们项目后期的维护是有很大帮助的。
七大设计原则之单一职责原则应用相关推荐
- Java设计原则之单一职责原则、开闭原则、里氏代换原则
文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...
- 设计原则:单一职责原则
单一职责原则(SRP) 单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP.这个原则的英文描述是这样的:A class or module shoul ...
- 经典设计原则:单一职责原则(SRP)
本文详解设计原则中的单一职责原则,目的还是提高代码的可读性.可扩展性.复用性.可维护性等. 目录 1. 单一职责原则(SRP) 2. 如何理解单一职责原则? 3. 如何判断类的职责是否足够单一? 4. ...
- 面向对象的七种原则:单一职责原则,开放关闭原则
我们的知识星球马上就要开始更新设计模式了,在更新设计模式之前,我们是不是需要做一些准备呢?否则设计模式中一些遵循的原则大家会一头雾水,所以我今天来给大家说一些面向对象的七种原则,有人说是6种有人说是7 ...
- SOLID原则:单一职责原则(SRP)
SOLID:SOLID 原则并非单纯的1个原则,而是由5个设计原则组成,它们分别是:单一职责原则.开闭原则.里式替换原则.接口隔离原则和依赖反转原则,SOLID 由5个设计原则的头一个字母组成. 如何 ...
- 设计模式六大原则(一)----单一职责原则
设计模式六大原则之[单一职则原则] 一.什么是单一职责原则 首先, 我们来看单一职责的定义. 单一职责原则,全称Single Responsibility Principle, 简称SRP. A cl ...
- 接口隔离原则和单一职责原则区别
接口隔离原则和单一职责原则区别 单一职责原则是备受争议的原则,根据不同的业务逻辑,它会将系统功能模块划分成不同种类,产生多样的接口,同时每个接口尽量只包含一个功能(方法). 而产生争议的原因就是这个业 ...
- 6大设计原则之单一职责原则
单一职责原则 如果有一个用户管理类,类图如下 我想,任谁也能看的出这个接口设计的有问题,用户的属性和用户的行为没有分开,应该把用户的信息抽取成一个业务对象,把用户的行为抽取成一个业务对象,按照这个思路 ...
- 架构中的设计原则之单一职责原则 - 《java开发技术-在架构中体验设计模式和算法之美》...
2019独角兽企业重金招聘Python工程师标准>>> 单一职责模式: 单一职责原则的核心思想就是:系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成. ...
最新文章
- lnmp集成开发环境安装pdo_dblib扩展
- WebAssembly 系列(一):生动形象地介绍 WebAssembly
- 方案接口服务器问题记录
- [!] Attempt to read non existent folder `***********`
- pcie握手机制_【博文连载】PCIe扫盲——Ack/Nak 机制详解(一)
- DatabaseMetaData information is not known for server DB2/xxx by this version of JDBC driver
- 计算机ip地址和用户名和密码忘记了怎么办,192.168.1.112这是IP地址 我把密码忘了 怎么处理啊 电脑室现在还...
- easyar android 开发,【EasyAR学习】安装Android SDK
- 教你炒股票27:回复
- LaTex图表中英文标题,中英文图表目录
- dns udp tcp
- 小程序中图片的移动、旋转和缩放功能
- java ee jpi是什么,JPI 150、300、600RF、RJ什么意思
- 运维,数据库 知识点文章集锦
- 达梦数据库查询模式名,表名,字段名
- 2021年一战南大AI上岸经验贴
- 天气变冷了,用Python给爸妈制作一个天气提醒小助手
- CSS实现图片文字排版02
- 含碘稀土铕(Ⅲ)配合物荧光微球/稀土铕配合物掺杂功能化二氧化硅微球的制备方法
- 手机网络游戏 一座尚待挖掘的金矿