基本介绍
对类来说,一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2.当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2
举个例子1
代码语言:javascript复制public class Animal01{
public void run(String animal){
System.out.println(animal "
flying....");
}
public static void main(String[] args){
Animal01 animal01 = new Animal01();
animal01.run("Cat");
animal01.run("Dog");
animal01.run("Bird");
}
}
// 运行结果
Cat flying....
Dog flying....
Bird flying....
分析:上述的例子1中,在类Animal01的run方法中,违反了单一职责原则。当需求变更时会对已有正确的返回产生影响
举个例子2
代码语言:javascript复制public class Animal02{
public static void main(String[] args){
Cat cat = new Cat();
cat.run("Cat");
Dog dog = new Dog();
dog.run("Dog");
Bird bird = new Bird();
bird.run("Bird");
}
}
class Cat{
public void run(String aniaml){
System.out.println(aniaml " miao,miao,miao...");
}
}
class Dog{
public void run(String animal){
System.out.println(animal " wang,wang,wang...");
}
}
class Bird{
public void run(String animal){
System.out.println(animal " fly,fly,fly...");
}
}
// 运行结果
Cat miao,miao,miao...
Dog wang,wang,wang...
Bird fly,fly,fly...
分析:上述的例子2中,遵守了单一职责原则,但是改动基于增加了三个类,这样做的后果是每次变更改动都很大,既将类分解,同时也要修改客户端,在这里Animal02的main方法相当于客户端
举个例子3
代码语言:javascript复制public class Animal03{
public static void main(String[] args){
Animal animal = new Animal();
animal.birdRun("Bird");
animal.catRun("Cat");
animal.dogRun("Dog");
}
}
class Animal{
public void catRun(String aniaml){
System.out.println(aniaml " miao,miao,miao...");
public void dogRun(String animal){
System.out.println(animal " wang,wang,wang...");
}
public void birdRun(String animal){
System.out.println(animal " fly,fly,fly...");
}
}
分析:上述的例子3中,在原有类的基础上增加了方法,虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然遵守单一职责
单一职责原则总结
1)降低类的复杂度,一个类只负责一项职责 2)提高类的可读性,可维护性 3)降低变更引起的风险 4)通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则