单一职责原则

单一职责原则:一个类应该只有一个原因引起改变,即一个类应该只负责一个业务逻辑。

问题由来:类T负责t1, t2两个职责,当因为t1j对类T修改的时候,可能导致类T出现问题而影响职责t2。

解决方案:遵循单一职责原则,将类T进行改写,确保一个类负责一个职责。

demo:

有一个类Animal,具有方法breath功能,一般的思路是这样子设计的:

class Animal {
public void breathe(String animal) {
System.out.println(animal + "呼吸空气");
} }

当你创建一个Animal实例后,就可以调用breathe方法了。

public class SingletonResponsibility {
public static void main(String[] args) {
Animal animal = new Animal();
animal.breathe("鸟类");
animal.breathe("狮子");
//逻辑错误:鱼类应该呼吸水
animal.breathe("鱼类");
}
}

我们发现,当调用breathe方法时,若是传入鱼类,输出结果不会发生变化。但是,这在逻辑上面是错误的。

##################

改进思路1:在breathe方法中进行判断

通过判断,区别对待:若是鱼类,则输出“呼吸水”;其他的动物,输出“呼吸空气”;

这样做的好处是:能够爆出业务逻辑的正确;但是违反了单一职责原则:类Animal除了负责正常的业务罗杰,还需要进行类型判断。

class Animal1 {
public void breathe(String animal) {
// 改进: 在方法中对animal进行判断,如果是鱼类,则显示呼吸水
// 弊端: 没有尊新单一职责原则,该方法除了需要执行正常的业务逻辑外,
// 还需要对animal进行判断。
if ("鱼类".equals(animal)) {
System.out.println(animal + "呼吸水");
} else {
System.out.println(animal + "呼吸空气");
}
}
}

改进思路2:对类、方法进行拆分

为了保证遵循单一职责原则,我们可以将类、方法进行拆分,并且保证了也为逻辑的正确。

class Animal2 {
// 改进: 新增一个呼吸水的方法,这种方式虽然在类级别违反了单一职责原则,
// 但是在方法上遵循了。
// 注意: 单一职责原则在实际使用中,指的是遵循单一的业务逻辑。
public void breathe(String animal) {
System.out.println(animal + "呼吸空气");
} public void breatheWater(String animal) {
System.out.println(animal + "呼吸水");
}
}

单一职责的优点:

1.降低类的负责度,一个类只对一个业务逻辑负责;

2.提高项目的可读性,可维护性;

3.j降低项目变更的风险;

注意事项:

在项目中,我们应该尽量遵循单一职责原则,但是,当业务逻辑较简单时,可以违背。

最新文章

  1. 分享一个漂亮的ASP.NET MVC界面框架
  2. php读取指定结束指针文件内容
  3. cojs 疯狂的字符串 题解报告
  4. 多个MapReduce作业相互依赖时,使用JobControl进行管理
  5. debian7 更换GCC版本
  6. 车的UML图
  7. Android4.0 声卡配置-高通msm8916移植
  8. MIB Browser如何导入已编译的mib
  9. React Native学习(九)—— 使用Flexbox布局
  10. 为什么qt成为c++界面编程的第一选择
  11. [物理学与PDEs]第5章习题6 各向同性材料时强椭圆性条件的等价条件
  12. BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组
  13. jquery 手机获取验证码计时
  14. 全卷积神经网络FCN
  15. 使用R语言-计算均值,方差等
  16. mysql--------char 和 varchar 的区别
  17. (转)使用UTL_SMTP包发送邮件
  18. JDBC上关于数据库中多表操作一对多关系和多对多关系的实现方法
  19. css常用属性初总结:伪元素和伪元素
  20. 20-list简单使用:

热门文章

  1. Hadoop 学习之路(一)—— 分布式文件系统 HDFS
  2. spring cloud 系列第6篇 —— zuul 服务网关 (F版本)
  3. eclipse下jdbc数据源与连接池的配置及功能简介
  4. 并发编程-concurrent指南-阻塞队列-延迟队列DelayQueue
  5. 常用的方法论-NPS
  6. Python入门(一) 异常处理
  7. Z点餐系统项目下期改进计划
  8. vue 跨域请求,后端cookie session取不到
  9. Redis中的Stream数据类型作为消息队列的尝试
  10. python文件下载