七大设计原则、单一职责原则
一、前言:
这个文章应该算不上是真正的博客,算是我一系列的学习笔记,和自己思考的过程,本来是存在电脑硬盘上的,但是害怕自己的电脑硬盘突然罢工,而且查看也不方便就打算用Typora 本地存放一份,然后博客园上上传一份,也方便电脑不在身边查看复习 (不放在有道云笔记的原因 ..Qiong+不方便)
我学习的视频是韩顺平老师的图解设计模式,要是有想看的小伙伴去BiliBili ~
二、正文
单一职责原则,之前在学校老师上课给讲过,感觉学习的挺明白的,但是现在反过来思考,一时间感觉自己并没有真正的掌握什么是单一职责原则,只是从字面意思上理解了 单一职责,就是负责一项任务,可能你看到这 4个字 感觉自己也是理解了,这个就是浅层次的理解,并没有深入的思考,也就是说下次有人问你什么是单一职责的时候你可能就给忘记了,所以最好是通过自己写过的代码,通过切身的实际经验来理解
视频中的例子:模拟汽车运行
(下面增加了我个人理解的场景如果需要原版,请看视频)
需求: 老板,给你了个需求,给你一个交通工具,然后你能在控制台上输出 .xxx 在公路上跑。(别问我老板的需求怎么回这么简单,可能老板不会编程吧),你痛痛快快的写完了,为了表示高超的技术,你还使用了oo ,设计了一个交通类
public class Main {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("汽车");
vehicle.run("公交汽车");
vehicle.run("摩托车");
}
}
class Vehicle{
public void run(String name){
System.out.println(name+" 在公路上飞驰···");
}
}
运行结果:
汽车 在公路上飞驰···
公交汽车 在公路上飞驰···
摩托车 在公路上飞驰···
但是需求总是善变的,如果是运行在公路上的交通工具这个没有问题,但是老板给了你个飞机。。。。。。。
那这个就有问题了,飞机怎么能在公路上飞呢。这个就是没有做到单一职责,因为你飞机和汽车用到了一起,
那么按照单一原则的解决方案呢,有两种,一种是为你每中需要用到的交通工具都创建一个类,然后里面分别实现跑这个方法,这个确实是实现了单一原则,但是有个问题就是每类交通工具都需要创建一个对象,内存开销会大的,所以可以将这些方法放在一个类中,然后给每种交通工具创建不同的方法名,然后调用的时候调用不同的方法名称就行了。
class Vehicle{
public void run(String name){
System.out.println(name+" 在公路上飞驰···");
}
public void airRun(String name)
{
System.out.println(name+" 在天上飞···");
}
public void waterRun(String name)
{
System.out.println(name+" 在水里走");
}
}
这点算是明白了,各位大佬是不是还要说可以定义一个接口,然后用不同的子类实现多态,更能增加程序的拓展性,这个当然好了,现在学习的level 还没到那个水准,以后应该会使用推展的。
还有一点就是,这些个方法也可以写到一个方法里面,通过使用if - else ,然后调用,这样算是单一职责原则吗? NO No No 这个可不算是单一职原则。
怎么不信? 那我提出个需求,只有满足某个时间段才能 输出这句话,毕竟每个交通工具都有运营时间的。
是不是 if 判断完交通工具,然后在判断时间,这样确实可以实现功能,但是后来又增加了很多条件,你感觉你的if 代码块 逻辑能清楚吗?
这个就是我对单一职责原则的理解。
- sql server之数据库语句优化
- 【专知-Java Deeplearning4j深度学习教程05】无监督特征提取神器—AutoEncoder:图文+代码
- 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】
- HDU 2689 Sort it【树状数组】
- BZOJ 1800: [Ahoi2009]fly 飞行棋【思维题,n^4大暴力】
- Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】
- GeetTest~下一代验证(附C#案例)
- [接口测试 - http.client篇] 17 http.client之入门级接口测试框架
- 评论JS插件~多说+畅言
- jQuery HTML5 Uploader
- 1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】
- [接口测试 - http.client篇] 16 基于http.client之POM实战一下
- 数论部分第一节:素数与素性测试【详解】
- ProtoBuf 序列化工具组件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 26.Python文件内容的迭代
- 28.Python中对象的特性
- 如何基于jackson动态序列化指定字段
- c/c++补完计划(五): 平衡二叉树和二叉搜索树
- 【原创】Java并发编程系列30 | ThreadLocal
- c/c++补完计划(六): 语法糖lambda
- 从别人的代码中学习golang系列--03
- Flink写出数据到HBase的Sink实现
- 「MoreThanJava」Day 4:面向对象基础
- RTSP协议视频平台EasyNVR接入EasyNVS通道不显示任何数据怎么处理?
- RTSP协议视频平台EasyNVR接入视频综合管理平台EasyNVS可以自由修改配置吗?
- 使用Azure人脸API对图片进行人脸识别
- 视频综合管理平台EasyNVS显示的rtsp和rtmp穿透地址错误如何解决?
- 开发RTSP协议视频平台EasyNVR采用ffmpeg集成fdk-aac报no member named “encoderDelay”
- 微信小程序开发实战(17):用画布画一张笑脸