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类承担了过多的职责:

    1. 管理基本人类属性(姓名、年龄)
    1. 处理基本生存行为(吃饭、行走)
    1. 处理艺术家能力(唱歌、跳舞)
    1. 处理超人的特殊能力(飞行)

正例

SuperHuman
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() + "正在飞行");
    }
}

总结

单一职责原则的核心价值体现在:

  1. 高内聚低耦合

    • 每个类只关注一个功能领域
    • 类间依赖关系清晰简单
  2. 可维护性

    • 修改一个职责不会影响其他职责
    • 错误定位更准确
  3. 可扩展性

    • 新增功能只需添加新类而非修改现有类
    • 符合开闭原则
  4. 清晰的设计

    • 类职责明确,易于理解
    • 系统结构更加直观
  5. 复用性

    • 职责单一的类更容易被复用
    • 可通过组合方式构建复杂功能

在实际应用中,识别类的职责边界是关键。一个好的经验法则是:如果一个类有多个修改原因,那么它很可能承担了过多职责。通过合理分解职责,可以构建出更健壮、更灵活的软件系统。

posted @ 2025-08-15 08:50  庞去广  阅读(9)  评论(0)    收藏  举报