1.基本介绍
对类来说的,即一个类应该负责一项职责。简单来说,一项职责不是指一个类负责一个方法,而是从职责入手,如:支付类你只管支付,而不要去管物流方面了。
2、应用实例
1)代码方案一
package com.hjj.principle;
/**
* @author HJJ
* @version 1.0
* @date 2021/1/16 10:46
*/
public class SingleResponsibility1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animal = new Animal();
animal.run("马");
animal.run("鱼");
animal.run("鸟");
}
}
class Animal {
public void run(String vehicle) {
System.out.println(vehicle + " 在草原上跑....");
}
}
- 代码解析
- 1. 在方式1 的run方法中,违反了单一职责原则
- 2. 解决的方案非常的简单,根据动物运动方法不同,分解成不同类即可
2)代码方案二
package com.hjj.principle;
/**
* @author HJJ
* @version 1.0
* @date 2021/1/16 10:49
*/
public class SingleResponsibility2 {
public static void main(String[] args) {
LandAnimal animal = new LandAnimal();
animal.run("马");
animal.run("鹿");
FishAnimal fishAnimal = new FishAnimal();
fishAnimal.run("鱼");
BirdAnimal birdAnimal = new BirdAnimal();
birdAnimal.run("鸟");
}
}
class LandAnimal {
public void run(String animal) {
System.out.println(animal + "在草原上跑");
}
}
class FishAnimal {
public void run(String animal) {
System.out.println(animal + "在水里游");
}
}
class BirdAnimal {
public void run(String animal) {
System.out.println(animal + "在天空飞");
}
}
- 代码解析
- 遵守单一职责原则
- 但是这样做的改动很大,即将类分解,同时修改客户端
- 改进:直接修改Animal 类,改动的代码会比较少=>方案3
3)代码方案三
package com.hjj.principle;
/**
* @author HJJ
* @version 1.0
* @date 2021/1/16 10:58
*/
public class SingleResponsibility3 {
public static void main(String[] args) {
Animal animal = new Animal();
animal.run("马");
animal.run("鱼");
animal.run("鸟");
}
}
class Animal2 {
public void run(String vehicle) {
System.out.println(vehicle + " 在草原上跑....");
}
public void runWater(String vehicle) {
System.out.println(vehicle + " 在水里游....");
}
public void runSky(String vehicle) {
System.out.println(vehicle + " 在天空飞....");
}
}
- 代码解析
- 这种修改方法没有对原来的类做大的修改,只是增加方法
- 这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责
- 主要适用于少个方法,一旦方法增加还是得用回之前的
3、单一原则注意事项和细节
-
降低类的复杂度,一个类只负责一项职责。
-
提高类的可读性,可维护性。
-
降低变更引起的风险
-
通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可用在代码级违反单一职责原则;只有类方法数量足够少,可以在方法级保持单一职责原则。