## 一、定义
单一职责原则(Single Responsibility Principle, SRP):一个软件实体(模块、类、方法)**只负责一个**
功能领域中的相应职责,或者可以定义为:就一个类而言,应该**只有一个引起它变化**的原因。
单一职责原则是实现**高内聚、低耦合**的指导方针,它是**最简单但又最难运用**的原则
## 二、优点
1.降低模块、类或方法的复杂度。
2.提高类可读性,系统的可维护性。
3.降低变更引起的风险。
## 三、示例
~~~
/**
* 小明同学的周末
*/
public class XiaoMing {
public void activity(String activity){
if("学习".equals(activity)){
System.out.println("小明周末在家学习!");
}else{
System.out.println("小明周末出去运动了!");
}
}
}
~~~
~~~
public class Test {
public static void main(String[] args) {
XiaoMing xm = new XiaoMing();
xm.activity("学习");
System.out.println("------");
xm.activity("运动");
}
}
~~~
~~~
小明周末在家学习!
------
小明周末出去运动了!
~~~
在这个示例中,一个方法包含了两个职责运动和学习,很明显两种职责的业务逻辑是不一样的,必须要修改代码。
而修改代码逻辑势必会相互影响容易造成不可控的风险。我们对职责进行分离解耦,来看代码:
~~~
//学习
public void study(String study){
System.out.println("小明周末在家" + study + "!");
}
//运动
public void motion(String motion){
System.out.println("小明周末出去" + motion + "!");
}
~~~
~~~
public class Test {
public static void main(String\[\] args) {
XiaoMing xm = new XiaoMing();
xm.study("学习");
System.out.println("--------------");
xm.motion("运动");
}
}
~~~
~~~
小明周末在家学习!
--------------
小明周末出去运动!
~~~
修改后的代码由原先的activity()方法解耦成两个职责单一的方法,每个方法只有一种可能让它产生变化,
这是方法层面的单一原则,我们在看看类方面。
~~~
public class Study {
//java学习
public void javaStudy(String name){
System.out.println("在家学习" \+ name);
}
//php学习
public void phpStudy(String name){
System.out.println("在家学习" \+ name);
}
//练习吉他
public void guitarStudy(String name){
System.out.println("在家练习" \+ name);
}
//练习唱歌
public void singStudy(String name){
System.out.println("在家练习" \+ name);
}
}
~~~
在上面的示例中我们看到Study类中包含了四个方法,虽然这四个方法都是学习相关的,但是细分的话我们能发现它们的职责还是不那么单一。学习JAVA和PHP,从性质上说它们两个是知识方面的,而练习吉他和唱歌,更偏向于技能和兴趣爱好方面。所以我们需要把它解耦成两个职责单一的类。
~~~
/**
* Create By Ke Shuiqiang 2020/3/6 15:42
* 知识学习
*/
public class KnowledgeSudy {
//java学习
public void javaStudy(String name){
System.out.println("在家学习" + name);
}
//php学习
public void phpStudy(String name){
System.out.println("在家学习" + name);
}
}
/**
* Create By Ke Shuiqiang 2020/3/6 15:44
* 兴趣爱好学习
*/
public class InterestStudy {
//练习吉他
public void guitarStudy(String name){
System.out.println("在家练习" + name);
}
~~~
- 前言
- 第一章 设计七大原则
- 第1节 开闭原则
- 第2节 依赖倒置原则
- 第3节 单一职责原则
- 第4节 接口隔离原则
- 第5节 迪米特法则
- 第6节 里氏替换原则
- 第7节 合成复用原则
- 第二章 简单工厂模式
- 第1节 使用场景
- 第2节 示例代码
- 第三章 创建者模式
- 第1节 工厂方法模式
- 第2节 抽象工厂模式
- 第3节 建造者模式
- 第4节 原型模式
- 第5节 单例模式
- 第四章 结构型模式
- 第1节 适配器模式
- 第2节 桥接模式
- 第3节 组合模式
- 第4节 装饰者模式
- 第5节 外观模式
- 第6节 享元模式
- 第7节 代理模式
- 第五章 行为模式
- 第1节 责任链模式
- 第2节 命令模式
- 第3节 迭代器模式
- 第4节 中介者模式
- 第5节 备忘录模式
- 第6节 观察者模式
- 第7节 状态模式
- 第8节 策略模式
- 第9节 模板方法模式
- 第10节 访问者模式
- 第11节 解释器模式