单一职责原则
参考文章:单一职责原则例子_javaduqing的博客-CSDN博客_单一职责原则举例
单一职责原则优点:
单一职责优点如下:
降低类的复杂度
提高类的可读性
提高系统的可维护性
降低变更引起的风险
定义:不要存在多余一个导致类变更的原因。
例如:类A负责两个不同的职责:职责a1,职责a2。但是当职责a1的需求变更我们去修改类A时,很有可能导致职责a2也被修改了。
那么为了解决这个方案:分别建立两个类A1,类A2。让类A1完成职责a1功能、类A2完成a2功能。这样当修改类A1的时候,就不会导致A2类中的功能改变。
这样一个类只负责一个职责是符合单一职责原则的,但是由于某种原因,将职责a,划分成了更加细粒度发a1和a2。如果想要满足单一职责原则,必须将将类A也进行对应的拆分成A1和A2分别负责职责a1和a2。但是这样就太麻烦了。所以,简单的修改类A,用它来负责两个职责是一个比较不错的选择,虽然这样做有悖于单一职责原则。(这样做的风险在于职责扩散的不确定性,因为我们不会想到这个职责a,在未来可能会扩散为a1,a2,a3,a4……an。所以记住,在职责扩散到我们无法控制的程度之前,立刻对代码进行重构。)
举例:
class Animal{
public void breathe(String animal){
System.out.println(animal+"呼吸空气");
}
}
public class Client{
public static void main(String[] args){
Animal animal = new Animal();
animal.breathe("牛");
animal.breathe("羊");
animal.breathe("猪");
}
}
运行结果:

但是这个时候又增加了一种动物鱼,鱼并不是呼吸空气,而是活在水里面的。那么就需要将类进行拆分。分为陆生动物类Terrestrial,水生动物Aquatic,代码如下:
class Terrestrial{
public void breathe(String animal){
System.out.println(animal+"呼吸空气");
}
}
class Aquatic{
public void breathe(String animal){
System.out.println(animal+"呼吸水");
}
}
public class Client{
public static void main(String[] args){
Terrestrial terrestrial = new Terrestrial();
terrestrial.breathe("牛");
terrestrial.breathe("羊");
terrestrial.breathe("猪");
Aquatic aquatic = new Aquatic();
aquatic.breathe("鱼");
}
}
运行结果:

但是这样发现虽然实现了单一职责原则,却很麻烦,不仅增加了一个类,还要对应的去修改客户端。所以对应的还有一种修改方法。
class Animal{
public void breathe(String animal){
System.out.println(animal+"呼吸空气");
}
public void breathe2(String animal){
System.out.println(animal+"呼吸水");
}
}
public class Client{
public static void main(String[] args){
Animal animal = new Animal();
animal.breathe("牛");
animal.breathe("羊");
animal.breathe("猪");
animal.breathe2("鱼");
}
}
运行结果:

这样我们也达到了预定的效果。虽然违背了单一职责原则,但是在方法级别上却是符合单一职责原则的,因为它并没有动原来的代码。

浙公网安备 33010602011771号