目录
1、基本介绍
单一职责原则(SRP:Single responsibility principle):又称单一功能原则。是对类来说的,即一个类应该只负责一项职责,如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2。
2、单一职责原则注意事项和细节
- 降低类的复杂度,一个类值负责一项职责。
- 提高类的可读性,可维护性。
- 降低变更引起的风险。
- 通常情况下,我们应当遵守单一职责原则,只是逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则。
3、应用实例
3.1、需求
有三种动物:猫、狗、麻雀;编程实现三种动物鸣叫。
3.2、传统方式实现
设计一个动物类:
public class Animal{
public void cry(String animalName){
if("猫".equals(animalName)){
System.out.println(animalName+":喵喵喵!");
}else if("狗".equals(animalName)){
System.out.println(animalName+":汪汪汪!");
}else if("麻雀".equals(animalName)){
System.out.println(animalName+":叽叽喳喳!");
}
}
}
客户端类:
public class Client{
public static void main(String[] args) {
Animal animal = new Animal();
animal.cry("猫");
animal.cry("狗");
animal.cry("麻雀");
}
}
问题分析:
这样设计达到了要求,但是违反了单一职责原则
解决方式非常简单,根据动物叫声不同,分解成不同的类即可。
3.3、遵守单一职责原则实现
设计三个类:猫、狗、麻雀
/**
* 动物接口
*/
public interface Animal{
public void cry(String animalName);
}
/**
* 猫类
*/
class Cat implements Animal{
@Override
public void cry(String animalName) {
System.out.println(animalName+":喵喵喵");
}
}
/**
* 狗类
*/
class Dog implements Animal{
@Override
public void cry(String animalName) {
System.out.println(animalName+":汪汪汪");
}
}
/**
* 麻雀类
*/
class Sparrow implements Animal{
@Override
public void cry(String animalName) {
System.out.println(animalName+":叽叽喳喳");
}
}
客户端类:
public class Client{
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
Animal sparrow = new Sparrow();
dog.cry("狗");
cat.cry("猫");
sparrow.cry("麻雀");
}
}
分析:我们将根据功能(叫声)的不同将三个动物设计为三个类,每个类只提供一个功能(叫声),符合单一职责原则。