一、定义
单一职责原则(Single Responsibility Principle, SRP):一个软件实体(模块、类、方法)只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则
二、优点
1.降低模块、类或方法的复杂度。
2.提高类可读性,系统的可维护性。
3.降低变更引起的风险。
三、示例
/**
* Create By Ke Shuiqiang 2020/3/5 23:31
* 小明同学的周末
*/
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);
}
//练习唱歌
public void singStudy(String name){
System.out.println("在家练习" + name);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。