合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## 一、定义 单一职责原则(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); } ~~~