0102_单一职责原则
单一职责原则
定义:就一个类而言,应该只有一个引起它变化的原因
场景描述
设计一个人类对象,人类属性有年龄、名称,动作有吃饭、行走、唱歌、跳舞、飞行等。
反例
public class Human {
// 年龄属性
private int age;
// 姓名属性
private String name;
/**
* 构造方法
* @param age 年龄
* @param name 姓名
*/
public Human(int age, String name) {
this.age = age;
this.name = name;
}
/**
* 吃饭方法 - 基本生存行为
*/
public void eat() {
System.out.println("人类在吃饭");
}
/**
* 行走方法 - 基本移动行为
*/
public void walk() {
System.out.println("人类在行走");
}
/**
* 唱歌方法 - 艺术家行为
*/
public void sing() {
System.out.println("人类在唱歌");
}
/**
* 跳舞方法 - 艺术家行为
*/
public void dance() {
System.out.println("人类在跳舞");
}
/**
* 飞行方法 - 特殊能力行为
* 注意:这个方法的存在说明了该类职责过多,因为不是所有人类都能飞行
* 应该将特殊能力提取到子类或接口中实现
*/
public void fly() {
if ("超人".equals(this.name)) {
System.out.println(this.name + "正在飞行");
} else {
System.out.println("只有超人才能飞行");
}
}
}
在反例中,Human类承担了过多的职责:
-
- 管理基本人类属性(姓名、年龄)
-
- 处理基本生存行为(吃饭、行走)
-
- 处理艺术家能力(唱歌、跳舞)
-
- 处理超人的特殊能力(飞行)
正例

BaseHuman类
- 单一职责:只处理人类基本属性和基本生存行为
- 稳定性高:这些是所有人共有的基本特征和行为
- 易于扩展:可作为其他人类类型的基类
public class BaseHuman {
// 年龄属性
private int age;
// 姓名属性
private String name;
public BaseHuman(int age, String name) {
this.age = age;
this.name = name;
}
/**
* 获取姓名
* @return 姓名
*/
public String getName() {
return name;
}
/**
* 吃饭方法
*/
public void eat() {
System.out.println(getName() + "在吃饭");
}
/**
* 行走方法
*/
public void walk() {
System.out.println(getName() + "在行走");
}
}
ArtistHuman类
- 单一职责:专门处理艺术相关的行为
- 遵循开闭原则:可以独立修改艺术行为而不影响其他类
- 可扩展性:可轻松添加新的艺术行为方法
public class ArtistHuman extends BaseHuman {
public ArtistHuman(int age, String name) {
super(age, name);
}
/**
* 唱歌方法
*/
public void sing() {
System.out.println(getName() + "在唱歌");
}
/**
* 跳舞方法
*/
public void dance() {
System.out.println(getName() + "在跳舞");
}
}
SuperHuman类
- 单一职责:专门处理超人的特殊能力
- 隔离变化:特殊能力的修改不会影响普通人类
- 清晰性:明确表示这是特殊能力,不是普通人类行为
public class SuperHuman extends BaseHuman {
public SuperHuman(int age, String name) {
super(age, name);
}
/**
* 飞行方法
*/
public void fly() {
System.out.println(getName() + "正在飞行");
}
}
总结
单一职责原则的核心价值体现在:
-
高内聚低耦合
- 每个类只关注一个功能领域
- 类间依赖关系清晰简单
-
可维护性
- 修改一个职责不会影响其他职责
- 错误定位更准确
-
可扩展性
- 新增功能只需添加新类而非修改现有类
- 符合开闭原则
-
清晰的设计
- 类职责明确,易于理解
- 系统结构更加直观
-
复用性
- 职责单一的类更容易被复用
- 可通过组合方式构建复杂功能
在实际应用中,识别类的职责边界是关键。一个好的经验法则是:如果一个类有多个修改原因,那么它很可能承担了过多职责。通过合理分解职责,可以构建出更健壮、更灵活的软件系统。

浙公网安备 33010602011771号